我很难用MPI实现前缀和。我想我错过了几行,但我不知道哪些缺失,应该放在哪里。这就是我所拥有的:
int main(int argc, char** argv){
int i, size, nprocs, rank;
int array[atoi(argv[1])];
int Destination, Destination_tag;
int Source, Source_tag, RecvData;
int len = sizeof(array)/sizeof(int);
for(i = 0; i < size; i++)
{
array[i] = i+rank*size;
}
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int id = rank;
//I believe the error is here
for(i = 0; i < size, i++)
{
message = (rank - pow(2,x));
Destination = message ;
Destination_tag = array.id;
MPI_Send(&message, 1, MPI_INT, Destination, Destination_tag, MPI_COMM_WORLD);
Source = message ;
Source_tag = message;
MPI_Recv(&RecvData, 1, MPI_INT, Source, Source_tag, MPI_COMM_WORLD, &Status);
//End of problem area
printf("My rank is %d n =%d \n",i,size);
MPI_Finalize();
return 0;
}
答案 0 :(得分:8)
不要使用MPI_Send
和MPI_Recv
手动计算前缀和,而是使用MPI_Scan
。 MPI_Scan
执行process_ {0}到process_ {your rank}的元素的部分包容性减少,允许您非常轻松地(并且有效地!)执行前缀求和。
例如,假设单个整数分布在这样的过程中:
过程0 = 2
过程1 = 3
过程2 = 4
过程3 = 5
使用MPI_Scan
作为缩减操作调用MPI_SUM
后,结果如下:
过程0 = 2
过程1 = 5
过程2 = 9
过程3 = 14
调用MPI_Exscan
进行独占扫描,这意味着减少将不包括调用过程中减少的数据。结果将如下所示:
进程0 =未定义(将你的recv_buffer设置为0或那里会有垃圾)
过程1 = 2
过程2 = 5
过程3 = 9
答案 1 :(得分:0)
您的MPI发送和接收呼叫可能是错误。总的来说,我被告知你应该总是通过一个
告诉MPI进程发送和接收的位置 if (rank == 0)
{
MPI_Send(...
}
if (rank == 1)
{
MPI_Recieve(...