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);因为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
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;