在MPI中接收分配了malloc的数组
编辑:这段代码没有特别的问题。我创建了我的代码的简化版本,这一部分工作得非常完美。我仍然不明白为什么它在我的整个代码中都不起作用,因为除了这个,我对所有东西都做了注释,但这可能太特别了。对不起,问错了 我编辑并在底部添加了我得到的错误 我正在尝试并行化一个C程序 当我试图将分配了malloc的数组从主进程传递到其余进程时,我遇到了错误。或者更好,当我试图接受它的时候 这是我遇到问题的一段代码:在MPI中接收分配了malloc的数组,c,arrays,malloc,mpi,C,Arrays,Malloc,Mpi,编辑:这段代码没有特别的问题。我创建了我的代码的简化版本,这一部分工作得非常完美。我仍然不明白为什么它在我的整个代码中都不起作用,因为除了这个,我对所有东西都做了注释,但这可能太特别了。对不起,问错了 我编辑并在底部添加了我得到的错误 我正在尝试并行化一个C程序 当我试图将分配了malloc的数组从主进程传递到其余进程时,我遇到了错误。或者更好,当我试图接受它的时候 这是我遇到问题的一段代码: if (rank == 0) { int *data=(int *) malloc(size*
if (rank == 0)
{
int *data=(int *) malloc(size*sizeof(int));
int error_code = MPI_Send(data, size, MPI_INT, 1, 1, MPI_COMM_WORLD);
if (error_code != MPI_SUCCESS) {
char error_string[BUFSIZ];
int length_of_error_string;
MPI_Error_string(error_code, error_string, &length_of_error_string);
printf("%3d: %s\n", rank, error_string);
}
printf("Data sent.");
}
else if (rank == 1)
{
int *data=(int *) malloc(size*sizeof(int));
int error_code = MPI_Recv(data, size, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
if (error_code != MPI_SUCCESS) {
char error_string[BUFSIZ];
int length_of_error_string;
MPI_Error_string(error_code, error_string, &length_of_error_string);
printf("%3d: %s\n", rank, error_string);
}
printf("Received.");
}
已发送数据。打印,然后是由第二个进程导致的内存转储的分段故障,并且从未打印接收到的
我想我没有收到好的数据。但是我尝试了几种可能性,我认为我必须传递变量的地址,而不仅仅是指向第一个位置的指针,所以我认为这是正确的方法,但它不起作用
从错误代码中无法打印任何内容
有人知道是什么导致了这个错误,我的错误是什么吗
谢谢
编辑:
这就是确切的错误:
*** Process received signal ***
*** End of error message ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
编辑2:
此代码适用于:
int main(int argc, char* argv[])
{
int size_x = 12;
int size_y = 12;
int rank, size, length;
char nodename[BUFSIZ];
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Get_processor_name(nodename, &length);
MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
if (rank == 0)
{
int *data=malloc(size*sizeof(int));
int error_code = MPI_Send(data, size, MPI_INT, 1, 1, MPI_COMM_WORLD);
if (error_code != MPI_SUCCESS)
{
char error_string[BUFSIZ];
int length_of_error_string;
MPI_Error_string(error_code, error_string, &length_of_error_string);
printf("%3d: %s\n", rank, error_string);
}
printf("Data sent.");
}
else if (rank > 0)
{
int *data=malloc(size*sizeof(int));
int error_code = MPI_Recv(data, size, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
if (error_code != MPI_SUCCESS)
{
char error_string[BUFSIZ];
int length_of_error_string;
MPI_Error_string(error_code, error_string, &length_of_error_string);
printf("%3d: %s\n", rank, error_string);
}
printf("Received.");
}
MPI_Finalize();
return 0;
}
我发现了问题,不是MPI调用,而是之前的函数在printf中忘记了一个我没有注意到的变量。这使得整个密码都被破解了。棘手的MPI…我看这里没有问题;你能发布一段完整的可运行代码来重现这个问题吗?如何设置大小,在何处声明状态?另一个更挑剔的问题是,通常认为最好的做法是不从malloc强制转换返回指针。你是对的,我创建了一个独立版本的代码,它可以正常工作。因此,问题肯定出在别处。我会更新我的问题。