- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将带有 bcast 的动态二维数组传递给所有级别。我有以下代码。
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv)
{
float **array;
int rank,size,i,j;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank==0)
{
array = (float **)malloc(10*sizeof(float));
for(i=0;i<10;i++)
array[i] = (float *)malloc(10*sizeof(float));
for(i=0;i<10;i++)
for(j=0;j<10;j++)
array[i][j]=i+j;
}
MPI_Bcast(array,10*10,MPI_FLOAT,0,MPI_COMM_WORLD);
MPI_Finalize();
}
出于某种原因,我无法理解我遇到的段错误。任何人都知道这是什么问题?
最佳答案
这里有三个问题 - 一个涉及分配,一个涉及分配的位置,一个涉及 MPI 如何工作,其他答案都没有涉及所有这些问题。
第一个也是最严重的问题是事物的分配位置。正如@davidb 正确指出的那样,就目前而言,您只在任务零上分配内存,因此其他任务没有内存来接收广播。
一般来说,对于 C 中的 2d 分配,您的代码几乎完全正确。在这段代码中:
array = (float **)malloc(10*sizeof(float));
for(i=0;i<10;i++)
array[i] = (float *)malloc(10*sizeof(float));
唯一真正的问题是第一个 malloc 应该是 10 个浮点指针,而不是 float :
array = (float **)malloc(10*sizeof(float *));
for(i=0;i<10;i++)
array[i] = (float *)malloc(10*sizeof(float));
@eznme 指出了这一点。第一种方法实际上可能会起作用,具体取决于您正在编译/链接的内存模型等,并且几乎肯定会在 32 位操作系统/机器上起作用 - 但仅仅因为它起作用并不总是意味着它是正确的:)
现在,最后一个问题是您已经在 C 中声明了一个完美的二维数组,但这不是 MPI 所期望的。当您调用此电话时
MPI_Bcast(array,10*10,MPI_FLOAT,0,MPI_COMM_WORLD);
您要告诉 MPI 发送 100 个 连续 float ,由 array
指向。您注意到库例程无法知道 array 是否是指向 2d 或 3d 或 12d array 开头的指针,或者各个维度是多少;它不知道是否必须遵循指针,如果需要,它也不知道要遵循多少指针。
所以你想发送一个浮点指针到 100 个连续的 float - 而在分配伪多维数组 (*) 的正常 C 方法中,你不一定有那个。您不一定知道此布局中第二行与第一行的距离 - 甚至在哪个方向。所以你真正想做的是这样的:
int malloc2dfloat(float ***array, int n, int m) {
/* allocate the n*m contiguous items */
float *p = (float *)malloc(n*m*sizeof(float));
if (!p) return -1;
/* allocate the row pointers into the memory */
(*array) = (float **)malloc(n*sizeof(float*));
if (!(*array)) {
free(p);
return -1;
}
/* set up the pointers into the contiguous memory */
for (int i=0; i<n; i++)
(*array)[i] = &(p[i*m]);
return 0;
}
int free2dfloat(float ***array) {
/* free the memory - the first element of the array is at the start */
free(&((*array)[0][0]));
/* free the pointers into the memory */
free(*array);
return 0;
}
这样,也只有这样,才能保证内存是连续的。然后你可以做
float **array;
/* ... */
malloc2dfloat(&array, 10, 10);
if (rank == 0) {
for(i=0;i<10;i++)
for(j=0;j<10;j++)
array[i][j]=i+j;
}
MPI_Bcast(&(array[0][0]), 10*10, MPI_FLOAT, 0, MPI_COMM_WORLD);
请注意,对于任意排列的数据,您仍然可以通过定义 MPI 数据类型来执行 Bcast
,该数据类型描述了二维数组实际上在内存中的布局方式;但这更简单,更接近您可能真正想要的。
(*) 这里的真正问题是 C 和 C 派生语言没有真正的多维数组作为一等对象——这对于系统编程语言来说很好,但在进行科学编程时却无可避免地令人恼火。
关于c - MPI_Bcast 动态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5104847/
所以我有一些代码,我使用 MPI_Bcast 将信息从根节点发送到所有节点,但我想让我的 P0 将数组块发送到各个进程。 如何使用 MPI_Send 和 MPI_Receive 执行此操作? 我以前从
我正在尝试在二维数组中广播我的第一行。这是代码: double *chunkPtr = malloc(sizeof(double) * columns); if (rank == 0) { c
我正在尝试 MPI,当我在命令行上通过 mpirun 运行它时,我不断收到此错误。 ----------------------------------------------------------
我按照 Jonathan 的代码从这里 ( MPI_Bcast a dynamic 2d array ) 到 MPI_Bcast 动态分配的二维结构数组。结构如下: typedef struct {
我试图让每个进程都以这种方式广播到所有其余进程 #include "mpi.h" #include int main(argc,argv) int argc; char **argv; { in
我收到 MPI_Bcast 错误(我认为这是一个旧错误)我不确定为什么会这样。错误如下: An error occurred in MPI_Bcast on communicator MPI_C
我在使用 MPI_Bcast 时遇到问题。一个处理器初始化类,然后必须将其发送给其他处理器。这是我的课: class A{ private: unsigned rows, cols; std::vec
我正在使用 MPI 并行乘以两个矩阵(二维数组),方法是将行平均划分并将它们分散在子进程中。主人也处理一大块行。我了解如何执行此操作并使用 MPI_Send/MPI_Recv 成功完成,但现在我正在尝
我试图在一台计算机上输入一个数字,然后使用 MPI 将其广播到所有其他计算机。 #include #include #include "mpi.h" int main (int argc, cha
这个问题在这里已经有了答案: Using MPI_Bcast for MPI communication (2 个答案) 关闭 7 年前。 我使用 MPI_Bcast 函数编写了简单的 MPI 程序
我有以下问题,我正在尝试发送 2 种类型的数据,1 种 int 和 2 种字符,这是我程序的一部分 #define Send(send_data, count, type, dest, tag) MP
我是 Open MPI 的新手,我正在尝试使用它来运行一个使用字典攻击的强力密码破解器(我实际上并不是在破解密码,这只是一个练习)。我使用的字典是 vector其中单词由空终止符分隔。 使用 MPI_
我正在尝试将带有 bcast 的动态二维数组传递给所有级别。我有以下代码。 #include #include int main(int argc, char **argv) { fl
我正在广播一个指向数组的指针 MPI_Bcast(&xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD); 来自进程 0 并从 0
为什么这段mpi代码没有发生死锁? int main(int argc, char *argv[]) { int rank,size; MPI_Init(&argc,
调用 MPI_BCAST 时,是否有隐含的同步?例如,如果发送方进程要在其他人之前到达 MPI_BCAST,它是否可以执行 BCAST,然后在没有任何确认的情况下继续?最近的一些测试代码如下: pro
MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) 此函数不需要等级参数。它如
我知道这段代码是正确的 #include #include "mpi.h" int main(int argc, char * argv[]){ int my_rank, p, n;
是 MPI_Bcast()阻塞还是非阻塞?换句话说,当根发送数据时,是否所有处理器都阻塞,直到每个处理器都收到该数据?如果没有,如何同步(阻止)所有这些,以便在所有接收到相同数据之前没有人继续。 最佳
我正在尝试 MPI_Bcast 将消息广播到多个节点,但遇到段错误,有时错误:139 或错误:255。以下是我的代码: char proposal[20]; char rep; int size, r
我是一名优秀的程序员,十分优秀!