gpt4 book ai didi

c - MPI 库和内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:48 24 4
gpt4 key购买 nike

我在理解共享内存的工作原理时遇到了一些问题。有一个主进程和 N 个其他进程。主进程向其他进程发送数据,我是这样写的(i进程的数据放在shared_mem[i]中):

int *shared_mem = calloc(numb_of_parts, sizeof(double));
if(world_rank == 0)
{
for(int i = 1; i < numb_of_parts; i++)
{
MPI_Send(shared_mem+i, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
}
}

接下来的过程计算一些东西并在同一个单元格中写入数据:

{
MPI_Recv(shared_mem+world_rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
/* do smth with shared_mem[i] */
MPI_Send(shared_mem+world_rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
}

然后我等待所有进程并想计算主进程中所有单元格(带有新数据)的总和:

PI_Barrier(MPI_COMM_WORLD);
if(world_rank == 0)
{
for(int i = 0; i < numb_of_parts; i++)
{
sum += shared_mem[i];
}
}

但结果我总是得到以前数据的总和,即在主进程数组中没有改变。怎么了?

最佳答案

你能尝试清除 double *shared_mem = calloc(numb_of_parts, sizeof(double)); 吗?目前,它被清除为 int*,因此 shared_mem[i]shared_mem+i 可能不是预期的那样,因为 int 的大小可以不同于 double 的大小。

此外,MPI 的一些特性可以显着帮助您:

@Gilles 是对的:缓冲区 mem_shared 不在进程之间共享。实际上,每个进程都分配自己的缓冲区 mem_shared,这就是需要消息传递的原因。

这是基于您的代码片段的工作代码。我必须为根进程添加接收标准。是缺少什么吗?用mpicc main.c -o main -sdt=c99编译,用mpirun -np 4 main运行。

/* -*- Mode: C; c-basic-offset:4 ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/

/* This is an interactive version of cpi */
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc,char *argv[])
{

int numb_of_parts, rank;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&numb_of_parts);


int *mem = calloc(numb_of_parts, sizeof(double));
if(rank == 0)
{
mem[0]=0;
for(int i = 1; i < numb_of_parts; i++)
{
mem[i]=i;
MPI_Send(mem+i, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);


}
for(int i = 1; i < numb_of_parts; i++)
{
MPI_Recv(mem+i, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}

}else{
MPI_Recv(mem+rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
/* do smth with shared_mem[i] */
mem[rank]=mem[rank]*2;
MPI_Send(mem+rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
}



MPI_Barrier(MPI_COMM_WORLD);
double sum=0;
if(rank == 0)
{
for(int i = 0; i < numb_of_parts; i++)
{
sum += mem[i];
}

printf("sum is %g\n",sum);
}

MPI_Finalize();
return 0;
}

问题可能在 /* do smth with shared_mem[i] */... 如果它什么都不做,或者它不修改 mem[rank].

关于c - MPI 库和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com