为什么我会得到一个;无效数据类型“;此示例mpi广播程序出错?

为什么我会得到一个;无效数据类型“;此示例mpi广播程序出错?,mpi,openmpi,Mpi,Openmpi,在做出评论中提到的更改后,没有得到任何输出 我是MPI新手。如果我用两个以上的进程运行它,我会在控制台上看到另外两行代码: 1-更多进程已发送帮助消息help-mpi-errors.txt/mpi\u errors\u是致命的 2-将MCA参数“orte_base_help_aggregate”设置为0以查看所有帮助/错误消息 我做错了什么? 这是我的终端上的完整输出: ***MPI_Bcast中发生错误 ***按进程报告[4248174593,1] ***关于通讯器MPI_通讯世界 ***MP

在做出评论中提到的更改后,没有得到任何输出

我是MPI新手。如果我用两个以上的进程运行它,我会在控制台上看到另外两行代码:

1-更多进程已发送帮助消息help-mpi-errors.txt/mpi\u errors\u是致命的

2-将MCA参数“orte_base_help_aggregate”设置为0以查看所有帮助/错误消息

我做错了什么? 这是我的终端上的完整输出:

***MPI_Bcast中发生错误

***按进程报告[4248174593,1]

***关于通讯器MPI_通讯世界

***MPI\u错误\u类型:无效的数据类型

***MPI\u错误是致命的(此通信器中的进程现在将中止

***以及潜在的MPI工作)

还有1个进程发送了帮助消息help-mpi-errors.txt/ mpi错误将MCA参数“orte\u base\u help\u aggregate”设置为0 查看所有帮助/错误消息

#包括
#包括
#包括
int main(int argc,字符**argv)
{
const int server=0;
const int source=服务器;
浮点*数组=(浮点*)NULL;
整数长度;
int num_procs、my_rank、mpi_error_code;
整数指数;
mpi_错误代码=mpi_初始化(&argc,&argv);
mpi_错误代码=mpi_通信等级(mpi_通信等级世界和我的等级);
mpi_错误代码=mpi_通信大小(mpi_通信世界和num_进程);
/*仅在服务器上输入、分配、初始化*/
if(my_rank==服务器){
扫描频率(“%d”和长度);
数组=(浮点*)malloc(sizeof(浮点)*长度);
对于(索引=0;索引<长度;索引++){
数组[索引]=0.0;
}
}
/*广播,所有进程上的输出*/
如果(进程数>1){
mpi_error_code=mpi_Bcast(&length,1,mpi_INT,source,mpi_COMM_WORLD);
如果(我的排名!=服务器){
数组=(浮点*)malloc(sizeof(浮点)*长度);
}
mpi_error_code=mpi_Bcast(数组、长度、mpi_INT、源、mpi_COMM_WORLD);
printf(“%d:广播长度=%d\n”,我的排名,长度);
}
mpi_错误代码=mpi_Finalize();
}

在C语言中,类型有
MPI\u INT
MPI\u DOUBLE
MPI\u FLOAT
等;在Fortran语言中,它们是
MPI\u整数
MPI\u双精度
MPI\u实数
,等等。您想使用
MPI\u INT
。谢谢Jonathan,将两个MPI\u整数参数更改为MPI\u INT。但是现在,我似乎遇到了一个新问题。我没有得到任何错误,但程序不会打印输出,似乎是在一个无限循环或什么股票。代码是正确的,为我工作。您是否在多个节点上运行?如果是这样的话,那么您应该意识到openmpi在使用可用网络接口时有点贪婪,并且可能会被某些配置卡住。请在节点上运行
ifconfig
,并提供输出。@hristoilev:我只在一个节点上运行它(它是我的笔记本电脑、Ubuntu 16.04和openmpi-1.10.2)。我没有得到任何输出。输出应该与此类似,当使用4个进程运行时:0:broadcast length=16777216 1:broadcast length=16777216 2:broadcast length=16777216 3:broadcast length=16777216这可能是一个愚蠢的问题,但由于您的程序最初以交互方式读取数组长度,您是否在挂起前键入该
16777216
?当您输入较小的长度(例如4)时会发生什么情况?在C中,类型为
MPI\u INT
MPI\u DOUBLE
MPI\u FLOAT
,等等;在Fortran语言中,它们是
MPI\u整数
MPI\u双精度
MPI\u实数
,等等。您想使用
MPI\u INT
。谢谢Jonathan,将两个MPI\u整数参数更改为MPI\u INT。但是现在,我似乎遇到了一个新问题。我没有得到任何错误,但程序不会打印输出,似乎是在一个无限循环或什么股票。代码是正确的,为我工作。您是否在多个节点上运行?如果是这样的话,那么您应该意识到openmpi在使用可用网络接口时有点贪婪,并且可能会被某些配置卡住。请在节点上运行
ifconfig
,并提供输出。@hristoilev:我只在一个节点上运行它(它是我的笔记本电脑、Ubuntu 16.04和openmpi-1.10.2)。我没有得到任何输出。输出应该与此类似,当使用4个进程运行时:0:broadcast length=16777216 1:broadcast length=16777216 2:broadcast length=16777216 3:broadcast length=16777216这可能是一个愚蠢的问题,但由于您的程序最初以交互方式读取数组长度,您是否在挂起前键入该
16777216
?输入较小长度(例如4)时会发生什么情况?
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char** argv)
{
    const int server = 0;
    const int source = server;
    float* array = (float*)NULL;
    int length;
    int num_procs, my_rank, mpi_error_code;
    int index;

    mpi_error_code = MPI_Init(&argc, &argv);
    mpi_error_code = MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    mpi_error_code = MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

    /*input, allocate, initialize on server only*/
    if(my_rank == server){
      scanf("%d", &length);
      array = (float*) malloc(sizeof(float) * length);
      for(index = 0; index < length; index++){
          array[index] = 0.0;
      }
    }
    /*broadcast, output on all processes*/
    if(num_procs > 1){
      mpi_error_code = MPI_Bcast(&length, 1, MPI_INT, source, MPI_COMM_WORLD);
      if(my_rank != server){
        array = (float*) malloc(sizeof(float) * length);
      }
      mpi_error_code = MPI_Bcast(array, length, MPI_INT, source, MPI_COMM_WORLD);
      printf("%d: broadcast length = %d\n", my_rank, length);
    }

    mpi_error_code = MPI_Finalize();
}