首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MPI_Type_contiguous时出现分段故障

使用MPI_Type_contiguous时出现分段故障
EN

Stack Overflow用户
提问于 2021-02-17 20:03:33
回答 1查看 72关注 0票数 2

我正在尝试理解MPI_Type_contiguous的工作原理,我已经为它写了一段代码

代码语言:javascript
复制
    #include "mpi.h"
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
        int myrank;
        MPI_Status status;
        MPI_Datatype type;
        int buffer[100];
        
        if(myrank==0)
        {
           for(int i=0;i<100;i++)
           {
               buffer[i]=i;
           }
        }
    
        MPI_Init(&argc, &argv);
     
        MPI_Type_contiguous( 100, MPI_CHAR, &type );
        MPI_Type_commit(&type);
     
        MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
     
        if (myrank == 0)
        {
            MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
        }
        else if (myrank == 1)
        {
            MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
        }
        if(myrank==1)
        {
           for(int i=0;i<100;i++)
           {
               printf("%d ",buffer[i]); 
           }
        }
     
        MPI_Finalize();
        return 0;
    }

但是它给了我这个错误

代码语言:javascript
复制
===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 11963 RUNNING AT csews20
=   EXIT CODE: 139
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions

我不能理解这个错误的原因,因为我无法在我的代码中找出分段错误的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-17 21:03:18

查看您的代码,我注意到数组的类型是int,而不是char,所以您应该使用MPI_INT而不是MPI_CHAR。此外,您需要首先初始化rank。只需这样做:

代码语言:javascript
复制
 MPI_Init(&argc, &argv);
 MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

然后使用排名。

代码语言:javascript
复制
#include "mpi.h"
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    int myrank;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
   
    MPI_Status status;
    MPI_Datatype type;
    int buffer[100];
    
    for(int i=0;i<100;i++)
    {
        buffer[i]=i;
    }
     
    MPI_Type_contiguous( 100, MPI_CHAR, &type );
    MPI_Type_commit(&type);
    
 
    if (myrank == 0)
    {
        MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
    }
    else if (myrank == 1)
    {
        MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
    }
    
   if(myrank==1)
    {
        for(int i=0;i<100;i++)
        {
            printf("%d ",buffer[i]);    
        }
    }
    MPI_Finalize();
    return 0;
}

我还推荐阅读下面的SO Thread MPI_Type_contiguous vs primitive types

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66241590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档