我是mpi的新手,我正在测试MPI_Scatterv以用于其他程序。我的MPI_Scatterv测试代码是:
#include <stdio.h>
#include "mpi.h"
int main(int argc,char *argv[])
{
int a[8]={1,2,3,4,5,6,7,8};
int rcounts[4]={2,2,2,2};
int disp[4]={0,2,4,6};
int b[8]={0,0,0,0,0,0,0,0};
int procid;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&procid);
MPI_Scatterv(&a, &rcounts, 0, MPI_INT, &b, 100, MPI_INT, 0, MPI_COMM_WORLD);
printf("%d",b[0]);
MPI_Finalize();
return 0;
}
编译时我收到以下警告:
./examples/Scatterv.c: In function ‘main’:
./examples/Scatterv.c:15:2: warning: passing argument 2 of ‘MPI_Scatterv’ from
incompatible pointer type [enabled by default]
/home/tarek/mpich-install/include/mpi.h:941:5: note: expected ‘const int *’ but
argument is of type ‘int (*)[4]’
运行时出现以下错误:
./examples/Scatterv.c: In function ‘main’:
./examples/Scatterv.c:15:2: warning: passing argument 2 of ‘MPI_Scatterv’ from
incompatible pointer type [enabled by default]
/home/tarek/mpich-install/include/mpi.h:941:5: note: expected ‘const int *’ but
argument is of type ‘int (*)[4]’
知道问题是什么?
答案 0 :(得分:0)
您错误地复制了编译器输出而不是运行时错误,但我会说您收到一个错误,即displacements数组是一个NULL指针,因为您将0
作为第三个参数传递给{{ 1}}你应该通过MPI_Scatterv
。此外,您已将disp
的大小指定为100.这违反了MPI标准 - 接收部分中的基本元素数量应与发送部分中为特定等级指定的基本元素数量相匹配。正确的电话会是:
b
如果您错误地使用地址 - 运算符MPI_Scatterv(a, rcounts, disps, MPI_INT,
b, rcounts[procid], MPI_INT, 0, MPI_COMM_WORLD);
,请参阅Domi的答案。这是编译器警告的原因,但它不应该有不良的运行时效果。