[英]Receiving an array allocated with malloc in MPI
编辑:特别是此代码没有问题。 我创建了代码的简化版本,此部分可以完美运行。 我仍然不明白为什么它不能在我的整个代码中起作用,因为我已经注释了所有内容,但这也许太特殊了。 抱歉,错误的问题。
(我编辑并在底部添加了我得到的错误)。
我正在尝试并行化C程序。
当我尝试将分配有malloc的数组从主进程传递到其余进程时遇到错误。 或者更好,当我尝试接收它时。
这是我遇到的一段代码:
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 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.