Tag: mpi

MPI Odd-Even排序如何工作?

只是在面试之前查看一些注释,并且正在努力理解Odd-Even排序在并行体系结构中是如何工作的。 int MPI_OddEven_Sort(int n, double *a, int root, MPI_Comm comm) { int rank, size, i, sorted_result; double *local_a; // get rank and size of comm MPI_Comm_rank(comm, &rank); //&rank = address of rank MPI_Comm_size(comm, &size); local_a = (double *) calloc(n / size, sizeof(double)); // scatter the array a to local_a MPI_Scatter(a, n / size, MPI_DOUBLE, local_a, […]

OpenMPI MPI_Barrier问题

我使用MPI_Barrier的OpenMPI实现有一些同步问题: int rank; int nprocs; int rc = MPI_Init(&argc, &argv); if(rc != MPI_SUCCESS) { fprintf(stderr, “Unable to set up MPI”); MPI_Abort(MPI_COMM_WORLD, rc); } MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); printf(“P%d\n”, rank); fflush(stdout); MPI_Barrier(MPI_COMM_WORLD); printf(“P%d again\n”, rank); MPI_Finalize(); 对于mpirun -n 2 ./a.out 输出应为:P0 P1 … 有时输出:P0 P0再次P1 P1 这是怎么回事?

优雅地退出MPI

如果Rdinput返回错误,我正试图优雅地退出我的程序。 #include #include #include #define MASTER 0 #define Abort(x) MPI_Abort(MPI_COMM_WORLD, x) #define Bcast(send_data, count, type) MPI_Bcast(send_data, count, type, MASTER, GROUP) //root –> MASTER #define Finalize() MPI_Finalize() int main(int argc, char **argv){ //Code if( rank == MASTER ) { time (&start); printf(“Initialized at %s\n”, ctime (&start) ); //Read file error = RdInput(); } Bcast(&error, 1, INT); […]

如何在消息传递系统中实现屏障?

我的理解是,一个主进程向所有其他进程发送消息。 返回的所有其他进程都会向主进程发送消息。 这是否足以让障碍工作? 如果没有,那还需要什么呢?

MPI系列主要function

这是一个非常基本的MPI问题,但我无法解决它。 我有一个main函数调用另一个使用MPI的函数。 我希望main函数以串行方式执行,而另一个函数并行执行。 我的代码是这样的: int main (int argc, char *argv[]) { //some serial code goes here parallel_function(arg1, arg2); //some more serial code goes here } void parallel_function(int arg1, int arg2) { //init MPI and do some stuff in parallel MPI_Init(NULL, NULL); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); //now do some parallel stuff //…. //finalize to end MPI?? […]

mpi.h:使用不定义它的类型?

我正在尝试将OpenMPI的mpi.h的重要部分翻译成D编程语言,所以我可以从D调用它。(HTOD根本不起作用。)我无法围绕下面的代码包围: typedef struct ompi_communicator_t *MPI_Comm; OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_world; OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_self; OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_null; 问题是ompi_communicator_t永远不会在mpi.h中定义,而mpi.h除了stddef.h之外不包含任何其他文件,它显然不包含定义。 (评论说它包含在ptrdiff_t 。)这些是mpi.h中唯一包含字符串ompi_communicator_t 。 这个结构的定义来自哪里? 有什么技巧我应该知道哪些类型可以凭空出现? (还有其他几种结构,但这是我偶然发现的第一个结构。)

将2Darrays的分布式块发送到MPI中的根进程

我有一个2D数组,它分布在MPI流程网格中(本例中为3 x 2个流程)。 数组的值是在分发该数组块的进程中生成的,我想在根进程中将所有这些块聚集在一起以显示它们。 到目前为止,我有以下代码。 这会生成一个笛卡尔通信器,找出MPI过程的坐标,并根据它计算出它应该得到多少数组(因为数组不需要是笛卡尔网格大小的倍数)。 然后我创建一个新的MPI派生数据类型,它将整个进程子数组作为一个项发送(也就是说,每个进程的步幅,块长度和计数都不同,因为每个进程都有不同大小的数组)。 但是,当我和MPI_Gather一起收集数据时,我遇到了分段错误。 我想这是因为我不应该在MPI_Gather调用中使用相同的数据类型来发送和接收。 数据类型适用于发送数据,因为它具有正确的计数,步幅和块长度,但当它到达另一端时,它将需要一个非常不同的派生数据类型。 我不确定如何计算此数据类型的参数 – 有没有人有任何想法? 另外,如果我从完全错误的角度接近这个,请告诉我! #include #include #include #include int main(int argc, char ** argv) { int size, rank; int dim_size[2]; int periods[2]; int A = 2; int B = 3; MPI_Comm cart_comm; MPI_Datatype block_type; int coords[2]; float **array; float **whole_array; int n = 10; int […]

使用MPI终止所有进程

我正在使用MPI来搜索解决方案,以便在不同线程之间划分问题空间。 每个线程都经过一个for循环,每次迭代都是解决方案的候选者。 问题是,当一个线程找到解决方案时,我希望它通知其他线程并且它们应该立即终止(或者至少在它们当前迭代结束时 – 或者下一个的开始)。 我怎么能用MPI做到这一点?

将libc回溯转换为源行号

我有一个MPI应用程序,它结合了C和Fortran源。 偶尔它会因为与内存相关的bug而崩溃,但是我很难找到这个bug(它是在别人的代码中的某个地方,目前我并不是很熟悉)。 我还没有能够用gdb捕获它,但有时会输出glibc backtrace,如下所示。 该错误可能接近“(main_main_ + 0x3bca)[0x804d5ce]”,(但有内存错误,我知道情况可能并非如此)。 我的问题是,有没有人知道如何将+ 0x3bca或0x804d5ce转换为代码的特定行? 关于追踪这个错误的任何其他建议也将受到赞赏。 我对gdb的基础知识非常熟悉。 *** glibc detected *** /home/…/src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 *** ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42] /lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525] /home/…/src/finite_element(main_main_+0x3bca)[0x804d5ce] /home/…/src/finite_element[0x804e195] /home/…/src/finite_element(main+0x34)[0x804e1e8] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3] /home/davepc/finite-element/src/finite_element[0x8049971] ======= Memory map: ======== 08048000-08056000 r-xp 00000000 08:05 1346306 /home/…/src/finite_element 08056000-08057000 r–p 0000d000 08:05 1346306 /home/…/src/finite_element 08057000-08058000 rw-p 0000e000 08:05 1346306 /home/…/src/finite_element 09d1b000-09d8f000 rw-p […]

如何在非常大的文本文件上直接有效地访问?

我有一个非常大的文本文件(+ 10GB),我想阅读一些数据挖掘技术。 为此,我使用MPI并行技术,因此许多进程可以一起访问同一个文件。 实际上,我希望每个进程读取N行数。 由于文件不是结构化的(相同数量的字段,但每个字段可以包含不同数量的字符),我有义务解析文件,这不是并行的,而且需要花费很多时间。 有没有办法直接访问特定数量的行,并解析和计算行数? 谢谢你的帮助。