gpt4 book ai didi

c - MPI_send 和 MPI_receive 函数卡住了

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:33 26 4
gpt4 key购买 nike

我有一个 page_rank 代码,我必须在其中并行计算页面排名。我的代码卡在我编写以下 MPI_send 和 MPI_receive 函数的地方。可能是什么问题呢?

int **sendto_list = (int **)malloc(comm_size*sizeof(int*));
for(i=0; i < comm_size; i++) {
sendto_list[i] = (int *)malloc(18*sizeof(int));
sendto_list[i][0] = 16;
sendto_list[i][1] = 0;
}

int temp_data = 1;
for(i=0; i < comm_size; i++) {
if(request_list[i][1] > 0) {
for(k=0; k < request_list[i][1]; ) {
for(j=0; j < 200; j++) {
if( k >= request_list[i][1] )
break;

sendrecv_buffer_int[j] = request_list[i][k+2];
k++;
}
// Request appropriate process for pagerank.
if(i!= my_rank)
MPI_Send(&temp_data, 1, MPI_INT, i, TAG_PR_REQ, MPI_COMM_WORLD);
}
}

if( i != my_rank )
MPI_Send(&temp_data, 1, MPI_INT, i, TAG_PR_DONE, MPI_COMM_WORLD);
}

int expected_requests = 0, done = 0,temp,s;
s=0;
while( (done == 0) && (comm_size > 1) ) {
if(expected_requests == (comm_size - 1))
break;

int count;
// Receive pagerank requests or messages with TAG_PR_DONE(can be from any process).
MPI_Recv(&temp, 1, MPI_INT, MPI_ANY_SOURCE ,MPI_ANY_TAG, MPI_COMM_WORLD, &status);

MPI_Get_count(&status, MPI_INT, &count);

switch(status.MPI_TAG) {
case TAG_PR_REQ:{
for(i = 0 ; i < count; i++)
insert_into_adj_list(&sendto_list[status.MPI_SOURCE], sendrecv_buffer_int[i], num_nodes);
break;
}
case TAG_PR_DONE:{
expected_requests++;
break;
}
default:
break;
}
}

最佳答案

粗略浏览一下您的代码,您的问题似乎是因为您的 MPI_Send() 调用被阻塞,因此没有任何接收和释放它们。

如果 (request_list[i][1] > 0)(i!= my_rank) 评估为 true 您尝试执行2 个 MPI_Send() 操作来处理 rank i 但你在每个进程中只有 1 个匹配的 MPI_Recv() 操作,即进程 rank

你可能想尝试改变

if(request_list[i][1] > 0) {
...
}

if( i != my_rank )
MPI_Send(&temp_data, 1, MPI_INT, i, TAG_PR_DONE, MPI_COMM_WORLD);

if(request_list[i][1] > 0) {
...
} else if( i != my_rank ) {
MPI_Send(&temp_data, 1, MPI_INT, i, TAG_PR_DONE, MPI_COMM_WORLD);
}

注意添加 elseif 转换为 else if。这确保每个进程只有 1 个 MPI_Send() 操作。如果上述条件为真,这两个 MPI_Send() 操作看起来不应该被执行。


或者,如果您需要,可以查看 MPI_Isend()MPI_Irecv() .虽然我不认为他们会在这种情况下完全解决你的问题。我仍然认为您需要 else if 子句。


我还想指出,在 C 中,不需要强制转换 malloc() 的返回值。 StackOverflow 上已经广泛讨论了这个主题,所以我不会在这上面详述太久。

您还应该检查 malloc() 的结果是一个有效的指针。如果发生错误,它返回 NULL

关于c - MPI_send 和 MPI_receive 函数卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220711/

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