Tag: openmpi

为什么mpirun不尊重我选择的BTL?

我在Windows 7机器上使用Cygwin上的Open MPI(1.8.3)。 我想在这台机器上独占运行MPI代码,而无需在任何外部网络上进行通信。 我知道我应该能够使用MCA选项将mpirun限制为自我和共享内存通信,如下所示: mpirun -n 8 –mca btl sm,self ./hello.exe 但是,当我尝试这个时,Windows会问我是否要设置防火墙例外,这表明我的工作是尝试通过TCP进行外部通信。 此外,mpirun将在完成前大约一分钟挂起,并且只有在hello world job完成之前我在无线网络上。 如果我关闭无线网卡或切换到有线以太网连接,它会在预期的大约一秒钟内完成。 为什么mpirun没有观察我选择的BTL?

openMPI在服务器集群上运行期间无限期等待?

我已成功在服务器和计算机之间设置密码减去ssh。 有一个简单的openMPI程序在单台计算机上运行良好。 但是,不幸的是,当我在群集上尝试这个时,我都没有得到密码提示(因为我已经设置了ssh授权),也没有执行正在向前发展。 Hostfile看起来像这样, # The Hostfile for Open MPI # The master node, ‘slots=8’ is used because it has 8 cores localhost slots=8 # The following slave nodes are single processor machines: gautam@pcys13.grm.polymtl.ca slots=8 gautam@srvgrm04 slots=160 我在群集上运行hello world MPI程序, int main(int argc, char *argv[]) { int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; double t; MPI_Init(&argc, […]

为什么这个MPI代码执行不正常?

我正在努力创造一个“Hello,world!” 在(开放)MPI中应用,使每个过程按顺序打印出来。 我的想法是让第一个进程在完成时向第二个进程发送消息,然后在第二个到第三个进程发送消息,等等: #include #include int main(int argc,char **argv) { int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); // See: http://mpitutorial.com/mpi-send-and-receive/ if (rank == 0) { // This is the first process. // Print out immediately. printf(“Hello, World! I am rank %d of %d.\n”, rank, size); MPI_Send(&rank, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); } else […]

MPI_Scatter – 未按预期工作

我正在使用MPI编写我的第一个程序,我很难尝试使用MPI_Scatter正确地将数据发送到其他进程,修改它们并使用MPI_Gather接收值。 代码如下: int** matrix; int m = 2, n = 2; int status; // could have been int matrix[2][2]; matrix = malloc(m*sizeof(int*)); for(i = 0; i < m; i++) { matrix[i] = malloc(n*sizeof(int)); } matrix[0][0] = 1; matrix[0][1] = 2; matrix[1][0] = 2; matrix[1][1] = 3; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( […]

OpenMPI永远等待着

当我执行此代码时,我没有响应,它等待永远,进程1将数据发送到根进程,但根进程没有收到它(或几乎就是我认为)。 #include #include #include “mpi.h” void my_parallel_function(int v[], int size, int rank) { MPI_Status status; int i; if(rank==0) { MPI_Send(&v[0], 10, MPI_INT, 1, 1, MPI_COMM_WORLD); } else { MPI_Recv(&v[0], 10, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD,&status); for(i=0;i<10;i++) { //change the value v[i] = i; //printf("hola soy nodo: %d\n", i); } MPI_Send(&v[0], 10, MPI_INT, 0, 2, MPI_COMM_WORLD); } […]

通过OpenMPI进行非阻塞数据共享

我正在尝试使用OpenMPI在多个工作人员之间传播数据,但是,我正在以相当自定义的方式进行数据划分,这种方式不适用于MPI_Scatter或MPI_Broadcast 。 我想要做的是给每个处理器一些工作在一个队列(或其他一些异步机制),这样他们可以在第一块数据上做他们的工作,采取下一个块,重复直到不再有块。 我知道MPI_Isend ,但是如果我用MPI_Isend发送数据,我不能修改它直到它完成发送; 强迫我使用MPI_Wait ,因此必须等到线程完成接收数据! 是否有解决此问题的标准解决方案,还是我必须重新考虑我的方法?

如何将-libm传递给MPICC? libimf.so:警告:feupdateenv未实现且始终失败

我是一个新手试图通过mpicc用gcc替换icc来编译程序。 我已经发现 ,我需要使用以下命令进行编译 $ OMPI_CC=gcc make 但是,我收到以下错误消息( 众所周知 ) /opt/intel/fce/9.1.036/lib/libimf.so: warning: warning: feupdateenv is not implemented and will always fail 我试着这样做 $ make clean && OMPI_CC=gcc OMPI_LDFLAGS=-libm make 然后我明白了 /usr/bin/ld: cannot find -libm collect2: ld returned 1 exit status 但是,我在那里找到了文件 lrwxrwxrwx /usr/lib/libm.so -> /lib/libm.so.6 lrwxrwxrwx /lib/libm.so.6 -> libm-2.3.6.so -rw-r–r– /lib/libm-2.3.6.so

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_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 […]

C,Open MPI:从调用到MPI_Finalize()的分段错误。 Segfault并不总是会发生,特别是在进程数量较少的情况下

我正在编写一个简单的代码来学习如何定义MPI_Datatype并将其与MPI_Gatherv结合使用。 我想确保我可以在一个进程上组合可变长度,动态分配的结构化数据数组,这似乎工作正常,直到我调用MPI_Finalize()。 我已经确认这是通过使用print语句和Eclipse PTP调试器(后端是gdb-mi)来解决问题的地方。 我的主要问题是,如何摆脱分段错误? 每次运行代码时都不会发生段错误。 例如,2或3个进程没有发生,但是当我运行大约4个或更多进程时,往往会定期发生。 此外,当我使用valgrind运行此代码时,不会发生分段错误。 但是,我确实从valgrind获得了错误消息,尽管我使用MPI函数时很难理解输出,即使有大量的目标抑制。 我也担心如果我使用更多的抑制,我会沉默一个有用的错误信息。 我使用这些标志编译正常代码,所以我在两种情况下都使用C99标准:-ansi -pedantic -Wall -O2 -march = barcelona -fomit-frame-pointer -std = c99和调试代码:-ansi -pedantic -std = c99 -Wall -g 两者都使用gcc 4.4 mpicc编译器,并使用Red Hat Linux和Open MPI v1.4.5在集群上运行。 如果我遗漏了其他重要的信息,请告诉我。 这是代码,并提前感谢: //#include #include #include #include #include //#include #include “mpi.h” #define FULL_PROGRAM 1 struct CD{ int int_ID; double dbl_ID; }; int […]