gpt4 book ai didi

c - 在 MPI 中接收使用 malloc 分配的数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:43 24 4
gpt4 key购买 nike

编辑:特别是这段代码没有问题。我创建了我的代码的简化版本,这部分工作得很好。我仍然不明白为什么它在我的整个代码中不起作用,因为我对除此之外的所有内容都进行了注释,但这可能太特别了。对不起,问错了。

(我编辑并在底部添加了我得到的错误)。

我正在尝试并行化 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.");
}

“数据已发送。”被打印出来,然后是第二个进程引起的段错误(带有内存转储),并且永远不会打印“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...

关于c - 在 MPI 中接收使用 malloc 分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24332709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com