MPI design about prime number and twin number (C++ and python)

MPI: message exchange in the processes

in this article, I just use MPI_SEND and MPI_RECV.

C++ version

#include<stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>    
#include <iterator>     // ostream_iterator
#include "/usr/include/mpi/mpi.h"
const int MAX_NUMBERS = 100;
using namespace std;
int prime_number(int n)
{
    int i;
    
    if(n < 2 ) return 0;
    for(i = 2; i < n; i++)
    {
        if( n % i == 0)
        return 0;
    }
    return 1;
}


int find_min_prime(int number, int rank)
{
    int temp;
    int check_number;

    temp = int(number / 8);
    if( 8 * temp + 2 * rank + 1 <= number )
            temp = temp + 1; 
    while (1)
    {
        check_number = temp * 8 + 2 * rank + 1;
        if (prime_number(check_number))
            break;
        temp += 1 ;
    }
    return check_number;

}



int find_twin_number(int number, int rank)
{
    int n;

    while(1)
    {
        n = find_min_prime(number, rank);
        if( prime_number(n+2))
            return (n,n+2);
        else
            number += 1;
    }


}



vector<int> count_twin(int number, int rank)
{
    int bottom;
    int above;
    int n;

    bottom = rank;
    above = number;
    vector< int> list;
    int * twin = new int[100]();
    int i = 0;

    while(1)
    {
        n = find_min_prime(bottom,rank);
        if (n + 2 > above)
            break;
        if (prime_number(n+2))
            {
                    list.push_back(n);
            }
        bottom += 1;
    
    }

    std::vector<int>::iterator it;
    it = std::unique (list.begin(), list.end());   // 10 20 30 20 10 ?  ?  ?  ?
    list.resize( std::distance(list.begin(),it) ); // 10 20 30 20 10

    return list;
}
    



int main(int argc, char* argv[])
{
    int a ;
    int prime;
    int state = 0;
    int number_amount;
    vector<int> list;
    vector<int> un_list;
    vector< int> list_prime_number;
    vector< int> list_twin_number;
    int numprocs, myid, source;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    int number = 20;
    int message;
    if (myid == 4) 
    { 
        for(int i = 0; i<4; i++)
        { 
            MPI_Send(&number, 1, MPI_INT, i, 11,MPI_COMM_WORLD);
            cout<< "send " << number << " to processes "<< i <<" for problem 3"<< endl;
        }
        for(int i = 0; i<4; i++)
        {   
            MPI_Recv(&message, 1, MPI_INT, i, 12,MPI_COMM_WORLD,NULL);         
            list_prime_number.push_back(message);
            MPI_Recv(&message, 1, MPI_INT, i, 13,MPI_COMM_WORLD,NULL);
            list_twin_number.push_back(message);
        }
         int least_prime_number = *min_element(list_prime_number.begin(),list_prime_number.end());
         int least_twin_number = *min_element(list_twin_number.begin(),list_twin_number.end());
        cout<< "the least  prime number  is " << least_prime_number <<endl;
        cout<< "the least twin number  is (" << least_twin_number <<","<< least_twin_number +2<< ")" << endl;

        

    }

    else
    {
        MPI_Recv(&message, 1, MPI_INT, 4, 11,MPI_COMM_WORLD,NULL);
        int prime_number = find_min_prime(message,myid);
        int twin_number =  find_twin_number(message,myid);
        cout<< "the  prime number  is " << prime_number << "  at process  "<< myid<<" for problem 4 "<<endl;
        cout<< "the  twin number  is (" << twin_number <<","<< twin_number +2<< ")" << "  at process  "<< myid<<" for problem 4 "<<endl;
        MPI_Send(&prime_number, 1, MPI_INT, 4, 12,MPI_COMM_WORLD);
        MPI_Send(&twin_number, 1, MPI_INT, 4, 13,MPI_COMM_WORLD);
        list = count_twin(message,myid);

        MPI_Send(&list[0], list.size(), MPI_INT, 4, 14,MPI_COMM_WORLD);

        
    }

    vector<int> twin_list;
   

     if (myid == 4) 
     {  
        // MPI_Status status;

        for(int i = 0;i < 4;i++) 
            {        
                   vector<int> list2(MAX_NUMBERS);
                    MPI_Recv(&list2[0],  MAX_NUMBERS, MPI_INT, i, 14,MPI_COMM_WORLD,NULL);
                    for(int f = 0;f<list2.size();f++)
                   {    
                       if (list2[f] != 0)
                      {  
                        // cout<<list2[f] << "  get from process :"<< i <<endl;
                        twin_list.push_back(list2[f]);}
                    }
            }

   
        for (int i = 0;i < twin_list.size();i++)
            cout<<  twin_list[i]  <<" the twin list"<<endl;
        
        int length = twin_list.size();
        cout<<" the twin list counts number is :  "<<length <<endl;

     }

    MPI_Finalize();
    return 0;
}



python version

from mpi4py import MPI
import numpy as np
import argparse

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

parser = argparse.ArgumentParser()
parser.add_argument('--n', nargs='?', type=int, default=50,
                help='must be int')
arg = parser.parse_args()
n = arg.n



def prime_number(n):
    if n < 2 :
        return False
    for i in range(2,n):
        if n%i == 0:
            return False
    return True

def find_min_prime(number,rank):
    temp = number // 8 
    if 8 * temp + 2 * rank + 1 <= number :
        temp = temp + 1 
    while (1):
        check_number = temp * 8 + 2 * rank + 1
        # print(check_number)
        if prime_number(check_number):
            break
        temp += 1 
    return check_number


def find_twin_number(number, rank):
    while(1):
        n = find_min_prime(number, rank)
        if prime_number(n+2):
            return (n,n+2)
        else:
            number += 1


def count_twin(number, rank):
    bottom = int(rank)
    above = int(number)
    twin = []
    while(1):
        n = find_min_prime(bottom,rank)
        if n + 2 > above:
            break
        if prime_number(n+2):
            if (n,n+2) not in twin:
                twin.append ((n,n+2))
        bottom += 1
    return twin

            

if rank == 4:
    data = int(n) 
    for i in range(4):
        comm.isend(data, dest=i, tag=11)                           
        print("process {} immediate send {}...for problem 2".format(rank, data))
else:
#     for rank in range(4)
    data_count_twin =  count_twin(n,rank)
    data = comm.recv(source=4, tag=11)                         
    print("process {} recv {}...".format(rank, data)) 
    # data = data + 2 * rank +1 
    prime_number,twin_number = find_min_prime(data,rank),find_twin_number(data,rank)
    data = {'prime_number':prime_number,'twin_number':twin_number}
    comm.isend(data, dest=4, tag=12)
    print("process {} immediate send {}... for problem 4".format(rank, data))
  #  print('rank',rank, 'count', data_count_twin)
    comm.isend(data_count_twin, dest=4, tag=13)
    print("process {} immediate send {}... for problem 5".format(rank, data_count_twin))


data_twin = []
data_fin = []
if rank == 4:
    for i in range(4):
        temp = comm.recv(source = i, tag = 12)
        data_fin.append(temp)                           
        print("process {} immediate recv {}...".format(rank, temp))    


    least_min_twin = min([i['twin_number'][0] for i in data_fin])
    print('min_prime_number: ',min([i['prime_number'] for i in data_fin]), 'min_twin_number:  ',(least_min_twin,least_min_twin+2))

    for i in range(4):
        data_twin.extend(comm.recv(source = i, tag = 13))
    data_count = list(set(data_twin))
    print('the total number of twin numbers less than n: ',len(data_count))
    print(data_count)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容