我有一个页面排名的代码,我必须并行计算页面排名。我的代码挂起在编写以下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)
evaluate totrue
您尝试执行2个MPI_Send()
操作来处理ranki
但每个进程中只有1个匹配的MPI_Recv()
操作,即process ranki
。
你可能想尝试改变
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);
}
注意将
else
转换为if
的添加。这样可以确保每个进程只有1个else if
操作。如果上述条件为真,则不应执行两个MPI_Send()
操作。或者,如果需要,您可以查看
MPI_Send()
和MPI_Isend()
。尽管我认为在这种情况下他们不会完全解决你的问题。我仍然认为你需要MPI_Irecv()
条款。我还要指出的是,在C语言中,不需要对
else if
的返回进行转换。这个话题已经在StackOverflow上被广泛地讨论过了,所以我不会太长时间地讨论它。您还应该检查
malloc()
的结果是否为有效指针。如果发生错误,则返回malloc()
。关于c - MPI_send和MPI_receive函数陷入困境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32220711/