Parallel processing 使用MPI_散射对阵列进行散射

Parallel processing 使用MPI_散射对阵列进行散射,parallel-processing,mpi,Parallel Processing,Mpi,我正在编写一个代码,其中有4个进程。Process-0读取64个数字(来自number.txt)。然后它将该数组分散到所有进程。为此,我声明了一个数组“arr[64]”,它对所有进程都是通用的。每个进程必须打印16个元素(进程0:0-16、进程1:16-32、进程2:32-48、进程3:48-64)并计算其范围的部分和。这就是为什么我有:for(I=(rank16);因为numsendbuffer有64个元素,并且通信器有4个进程,sendcount和recvcount应该都是16。在arr[0

我正在编写一个代码,其中有4个进程。Process-0读取64个数字(来自number.txt)。然后它将该数组分散到所有进程。为此,我声明了一个数组“arr[64]”,它对所有进程都是通用的。每个进程必须打印16个元素(进程0:0-16、进程1:16-32、进程2:32-48、进程3:48-64)并计算其范围的部分和。这就是为什么我有:for(I=(rank16);因为
num
sendbuffer有64个元素,并且通信器有4个进程,sendcount和recvcount应该都是
16
。在
arr[0:31]
中的每个任务上都会有分散的数据,因此您可以声明
int-arr[16]
。但是我需要将整个阵列发送到所有进程,这就是为什么我将两个缓冲区都设置为64。如果我将缓冲区设置为16,那么所有进程都会接收整个阵列吗?如果要发送整个阵列,那么您要使用
MPI\u Bcast()
好的,你能解释一下为什么每个进程都有16个元素在arr[0:31]中吗?你是说arr[0:15]吗?哎呀,我是说写
arr[0:15]
int main(int argc, char** argv){
    int size, rank,i,j,count=0,final_val;
    int sum=0;
    int total[4]={0,0,0,0};
    int arr[64];
    int num[64];
    //int *buff=NULL;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    
    if(rank==0)
    {
        
        //Read File:
        FILE *fp;
        fp = fopen("number.txt" , "r");
        if(fp == NULL) 
        {
        perror("Error opening file");
        return(-1);
        }
   
        while (!feof (fp))
            {  
            fscanf (fp, "%d", &i);  
            num[count]=i;
            count+=1;
            }
        fclose (fp);
        //buff = num;
        
    }

    MPI_Scatter(num,64, MPI_INT,arr,64, MPI_INT,0, MPI_COMM_WORLD);
    
        for(i=(rank*16);i<((rank*16)+16);i++)
        {
            printf("%d\n",arr[i]);
            sum+=arr[i];
        }
        printf("sum_%d: %d\n",rank,sum);
MPI_Finalize();
    return 0;