Tag: mpi

发件人和收件人的MPI_Datatype类型不同

使用MPI,可以使用从相同基本类型派生并具有相同总长度的不同MPI_Datatype来发送和接收数据吗? 考虑两个MPI进程A和B. A有一个数组double a[n] , B有一个数组double b[m] 。 两个进程都知道A想要发送以某种方式分布在a B k双精度(只有A知道这个分布)。 B (并且只有B )知道它想如何在b排列k双打。 因此,两者都创建(通过MPI_Type_indexed和MPI_Type_commit )数据类型,对于A ,它对应于它想要从a发送的元素,对于B ,它对应于它想要将这些元素保存到b 。 A调用MPI_Isend(a, 1, A_datatype, …)和B调用MPI_Irecv(b, 1, B_datatype, …) 。 这有用吗? 如果是,这是解决手头问题的标准方法吗? 如果不是,这种数据交换如何通常完成?

MPI_Reduce无法按预期工作

我是MPI的新手,我正在尝试使用MPI_Reduce来查找整数数组的最大值。 我有一个大小为arraysize的整数数组arr ,这是我的代码: MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &number_of_processes); MPI_Comm_rank(MPI_COMM_WORLD, &my_process_id); MPI_Bcast(arr, arraysize, MPI_INT, 0, MPI_COMM_WORLD); MPI_Reduce(arr, &result, arraysize, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); if(!my_process_id){ printf(“%d”, result); } MPI_Finalize(); 我的程序编译并运行8个进程,没有任何问题,但是,屏幕上没有任何内容。 出于调试目的,我将条件更改为if(my_process_id) (不带! )并运行。 然后我得到一个奇怪的输出,例如00030000 ,其中3可能在这个列表中的任何地方都是不确定的。 3是我的数组的第一个值(但不是最大值)。 我一般都知道并行编程(不是专家,但我通常知道我在做什么)但我对MPI很新,我可能会犯一个明显的错误。 我在网上看到的所有教程都有类似于我的代码示例,我不知道我做错了什么。 谢谢, 能够。

MPI运行错误“导致所有级别的集体中止”

我正在尝试使用C中的MPI编写并行编程。但是,当我运行我的程序时,我得到了该消息,我的程序终止了。 我不知道该错误消息的原因 警告:无法读取mpd.hosts或主机列表。 MPI作业仅在当前计算机上运行。 解决方案正在开始 作业1 server_name_60409中的等级7导致等级7的所有等级退出状态的集体中止:返回代码0 作业1 server_name_60409中的等级6导致等级6的所有等级退出状态的集体中止:返回代码0 作业1中的等级4 server_name_60409导致等级4的所有等级退出状态的集体中止:被信号9杀死 作业1中的等级3 server_name_60409导致等级3的所有等级退出状态的集体中止:被信号9杀死 作业1中的等级2 server_name_60409导致等级2的所有等级退出状态的集体中止:返回代码0 作业1中的等级0 server_name_60409导致等级0的所有等级退出状态的集体中止:返回代码0

使用MPI_Gather openmpi c收集字符串

我想为每个进程生成一个字符串,然后收集所有内容。 但是每个进程中创建的字符串都是通过附加int和chars创建的。 我仍然无法正确收集所有东西。 我可以逐个打印所有部分字符串,但是如果我尝试打印rcv_string,我只得到一个部分字符串或者可能是分段错误。 我已经尝试在memset的字符串末尾添加零,动态和静态地为字符串保留内存,但是我找不到方法。 如果有人知道如何对字符串进行初始化并正确地进行聚集以实现目标,那将会很棒。 int main(int argc, char *argv[]) { int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); char *string; // ???????????? char *rcv_string; // ???????????? if (rank == 0) { sprintf(string+strlen(string), “%dr%dg%db%dl\n”,255,255,255,0); } else if (rank == 1) { sprintf(string+strlen(string), “%dr%dg%db%dl\n”,255,255,255,0); } else if (rank == 2) { sprintf(string+strlen(string), “%dr%dg%db%dl\n”,255,255,255,0); } else if (rank […]

MPI会杀死不需要的进程

我正在使用带有C绑定的OpenMPI。 在我的代码中,有一个必需的进程数。 如果执行MPI使得打开的进程多于所需的进程,我希望终止或终止额外的进程。 我怎样才能做到这一点? 当我尝试以我能想到的几种方式时,我收到以下错误: mpirun has exited due to process rank 3 with PID 24388 on node pc15-373 exiting without calling “finalize”. This may have caused other processes in the application to be terminated by signals sent by mpirun (as reported here).

使用接近`INT_MAX`的`count`值来传递数据

消息传递接口API始终使用int作为count变量的类型。 例如, MPI_Send的原型是: int MPI_Send(const void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); 如果要发送或接收的元素数量增长接近或甚至超过 INT_MAX则这可能是一个问题。 当然,这个问题可以解决,通过以下方式降低count : 将单个呼叫分成多个呼叫 定义(不必要的)聚合MPI_Datatype 无论如何,这两种方法都不是真正的解决方案,特别是如果使用简单的启发式方法实现的话。 因此,我想问的是: 使用标准MPI呼叫处理这类案件是否有更好的习惯用法? 如果没有,是否有人知道围绕MPI构建的一些(可靠的)包装器库来克服这个限制?

如果缓冲区大小超过256,则第二个MPI_Send挂起

int n, j, i, i2, i3, rank, size, rowChunk, **cells, **cellChunk; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if(!rank){ printf(“\nEnter board size:\n”); fflush(stdout); scanf(“%d”, &n); printf(“\nEnter the total iterations to play:\n”); fflush(stdout); scanf(“%d”, &j); srand(3); rowChunk = n/size; //how many rows each process will get for(i=1; i<size; i++){ MPI_Send(&n,1, MPI_INT, i, 0, MPI_COMM_WORLD); MPI_Send(&j,1, […]

如何为动态加载编写MPI包装器

由于MPI不提供二进制兼容性,只提供源兼容性,因此我们不得不将求解器源代码发送给客户,以便他们将我们的求解器与其首选版本的MPI一起使用。 好吧,我们已经达到了无法再提供源代码的程度。 因此,我正在研究如何围绕MPI调用创建包装器。 我们的想法是为我们提供存根函数的头,用户将编写实现,从中创建动态库,然后我们的解算器将在运行时加载它。 但解决方案并不“优雅”,容易出错。 因为有struct参数(比方说, MPI_Request ),其struct定义可能因MPI实现而异,我们需要接受(void*)许多存根参数。 此外,如果参数的数量可以从一个MPI到另一个MPI(我不确定它是否可以保证不会发生),那么唯一的方法就是使用var_args 。 //header (provided by us) int my_stub_mpi_send(const void buf, int count, void* datatype, int dest, int tag, void* comm); //*.c (provided by user) #include #include int my_stub_mpi_send(const void buf, int count, void* datatype, int dest, int tag, void* comm) { return MPI_Send(buf, count, *((MPI_Datatype) datatype), dest, […]

如何获取MPI中的物理机数量

我可以使用MPI_Comm_size来获取总处理器的数量。 但是如何获得真实物理机的数量?

如果集合在进程中不可分,则使用MPI_Scatter

我有一个使用MPI_Scatter()和MPI_Gather()的程序。 程序将整数N作为输入,并将素数从2返回到N.我创建一个数字从2到N的数组,并且MPI_Scatter将数组拆分为N /(procs)元素,然后将它们分配给过程。 如果我插入一个数字N,它对于进程数(’size’)可以整除,一切正常,但是当我输入一个不能为’size’整除的N时,我会有一些错误。 例如:N = 16且size = 4 => 16/4 = 4,所以N%size == 0,但是当N%size!= 0时,我会有错误。 我试着添加: div = N/size; if (N%size != 0) if (rank == 0) div++; rank是当前进程的排名,为根进程提供一个元素。 但它仍然无法正常工作。 我怎么解决这个问题? 先感谢您。