Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MPI_发送和MPI_接收功能卡住_C_Mpi_Openmpi - Fatal编程技术网

C MPI_发送和MPI_接收功能卡住

C MPI_发送和MPI_接收功能卡住,c,mpi,openmpi,C,Mpi,Openmpi,我有一个PageRank代码,我必须并行计算PageRank。我的代码挂起在我编写以下MPI_发送和MPI_接收函数的地方。有什么问题吗 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; sen

我有一个PageRank代码,我必须并行计算PageRank。我的代码挂起在我编写以下MPI_发送和MPI_接收函数的地方。有什么问题吗

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;
    }
}
int**sendto_list=(int**)malloc(comm_size*sizeof(int*);
对于(i=0;i0){
对于(k=0;k=请求列表[i][1])
打破
sendrecv_buffer_int[j]=请求列表[i][k+2];
k++;
}
//请求pagerank的适当流程。
如果(i!=我的排名)
MPI_发送(&temp_数据,1,MPI_INT,i,标记请求,MPI_通信世界);
}
}
如果(i!=我的排名)
MPI_发送(&temp_数据,1,MPI_INT,i,标记完成,MPI_通信世界);
}
int预期_请求=0,完成=0,临时,s;
s=0;
而((完成==0)和&(通信大小>1)){
如果(预期的_请求==(通信大小-1))
打破
整数计数;
//接收pagerank请求或标记完成的消息(可以来自任何进程)。
MPI_记录(&temp、1、MPI_INT、MPI_任意源、MPI_任意标记、MPI_通信世界和状态);
MPI_获取计数(&status,MPI_INT,&count);
开关(状态.MPI_标记){
案例标签要求:{
对于(i=0;i
粗略地看一下您的代码,似乎您的问题是因为您的
MPI_Send()
调用被阻塞,因此没有任何东西接收和释放它们

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

你可以试着换衣服

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

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

注意添加了
else
if
转换为
else if
。这确保每个进程只执行1次
MPI\u Send()
操作。如果上述条件为真,则看起来不应该执行两个
MPI\u Send()
操作


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


我还想指出,在C中,没有必要强制执行
malloc()
的返回。这个主题已经在StackOverflow上进行了广泛的讨论,所以我不会在这里停留太久


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

您将陷入死锁。看看openmp标签是否真的相关?我没有看到任何#pragma。从不检查
malloc
返回值是在询问segfaults。
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);
}