有关MPI_District executer&;它的发送缓冲区分配

有关MPI_District executer&;它的发送缓冲区分配,mpi,Mpi,我的第一个想法是MPI\u Scatter,在if(proc\u id==0)子句中应该使用发送缓冲区分配,因为数据应该只分散一次,每个进程只需要发送缓冲区中的一部分数据,但是它不能正常工作 似乎在应用程序正常运行之前,所有进程都必须执行发送缓冲区分配和MPI_分散 所以我想知道,既然所有进程都可以访问发送缓冲区,那么MPI\U分散的存在原理是什么 任何帮助都将不胜感激 编辑: 我这样写的代码: if (proc_id == 0) { int * data = (int *)mallo

我的第一个想法是
MPI\u Scatter
,在
if(proc\u id==0)
子句中应该使用发送缓冲区分配,因为数据应该只分散一次,每个进程只需要发送缓冲区中的一部分数据,但是它不能正常工作

似乎在应用程序正常运行之前,所有进程都必须执行发送缓冲区分配和MPI_分散

所以我想知道,既然所有进程都可以访问发送缓冲区,那么MPI\U分散的存在原理是什么

任何帮助都将不胜感激


编辑: 我这样写的代码:

if (proc_id == 0) {
    int * data = (int *)malloc(size*sizeof(int) * proc_size * recv_size);
    for (int i = 0; i < proc_size * recv_size; i++) data[i] = i;

    ierr = MPI_Scatter(&(data[0]), recv_size, MPI_INT, &recievedata, recv_size, MPI_INT, 0, MPI_COMM_WORLD);
}
if(proc\u id==0){
int*data=(int*)malloc(大小*sizeof(int)*过程大小*recv大小);
对于(inti=0;i

我认为,对于根进程来说,这足以分散数据,其他进程需要做的只是接收数据。因此,我在
if(proc\u id==0)
语句中加入了
MPI\u Scatter
,以及发送缓冲区定义和分配。没有编译/运行时错误/警告,但是其他进程的接收缓冲区没有接收到它对应的部分数据。

您的问题不是很清楚,如果您显示了一些您遇到问题的代码,那么就更容易理解了。这是我想你们会问的问题——我只是猜测,因为我见过一些不熟悉C语言MPI的人犯过这样的错误

如果您有如下代码:

if (proc_id == 0) {
    int * data = (int *)malloc(size*sizeof(int) * proc_size * recv_size);
    for (int i = 0; i < proc_size * recv_size; i++) data[i] = i;

    ierr = MPI_Scatter(&(data[0]), recv_size, MPI_INT, &recievedata, recv_size, MPI_INT, 0, MPI_COMM_WORLD);
}
#包括
#包括
#包括
int main(int argc,字符**argv){
int proc_id、大小、ierr;
int*数据;
int接收数据;
ierr=MPI_Init(&argc,&argv);
ierr |=MPI_通信大小(MPI_通信世界和大小);
ierr |=MPI通信等级(MPI通信世界和过程id);
if(proc_id==0){
数据=(int*)malloc(size*sizeof(int));

对于(int i=0;iI)发布我的代码片段,正如您看到的,我在PThread逻辑中思考,在PThread逻辑中,共享内存充当通信方法。我对mpi没有太多知识。非常感谢,您帮助我理解了mpi的原理。