Tag: mpi

OpenMPI 1.4.3 mpirun hostfile错误

我试图在4个节点上运行一个简单的MPI程序。 我正在使用在Centos 5.5上运行的OpenMPI 1.4.3。 当我使用hostfile / machinefile提交MPIRUN命令时,我没有输出,收到空白屏幕。 因此, 我必须杀死这份工作。 。 我使用以下运行命令:: mpirun –hostfile hostfile -np 4 new46 OUTPUT ON KILLING JOB: mpirun: killing job… ————————————————————————– mpirun noticed that the job aborted, but has no info as to the process that caused that situation. ————————————————————————– mpirun was unable to cleanly terminate the daemons on the nodes […]

打开MPI – mpirun在简单程序上退出并出错

我最近在我的计算机上安装了OpenMPI,当我尝试运行一个简单的Hello World程序时,它会退出并出现下一个错误: ——————————————————- Primary job terminated normally, but 1 process returned a non-zero exit code.. Per user-direction, the job has been aborted. ——————————————————- 这是该程序的源代码: #include #include int main(int argc, char *argv[]) { int size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); printf(“Hello\n”); MPI_Finalize(); return 0; } 这是我编译程序的方式: mpicc -o hello hello.c 我用它执行它 mpirun -np 2 […]

MPI_Allgather和动态结构

我想用MPI_Allgather()发送一个结构数组,但我的结构有一个动态数组: typedef struct { float a; int* b; } structure_t; 我的结构通过以下方式初始化: structure_t *resultat = (structure_t*) malloc( sizeof( structure_t ) + n * sizeof( int ) ); 但是如何使用MPI_Allgather发送我的结构? 如何创建两个(发送和接收)数组?

如何在MPI中按顺序打印日志

是)我有的 我有一个使用MPI的C程序,它使用4个过程:1个车辆(taskid = 0)和3个乘客。 车辆每次可容纳2名乘客。 3位客户不断回来乘车。 对于车辆,我有: int passengers[C] = {0}; while(1) MPI_Recv(&pid, 1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status); //put pid in passengers[totalNumberArrived] if(totalNumberArrived == 2) printf(“vehicle left…”); sleep(5); printf(“vehicle came back…”); for (i=0; i<2; i++) MPI_Send(&passengers[i], 1, MPI_INT, passengers[i], 1, MPI_COMM_WORLD); totalNumberArrived = 0; if(done)//omitting the details here break; 而且,对于每位乘客,我有: for (i to NumOfRound) […]

如何在循环中重用MPI_Scatter和MPI_Gather

我试图学习如何多次使用MPI_Scatter和MPI_Gather ,并在等待这两个MPI函数完成后打印出结果。 在进程0,程序的顶部,我想使用一个调用Scatter和Gather的while循环。 完成所有计算后,我想将此数组发送回这些函数以进行更多计算。 我在下面的代码中解释了我想要做什么。 /*…..*/中的注释是我想要实现的任务。 以下代码使用4个处理器运行。 :$ mpicc test.c -o test :$ mpirun -np 4 test #include #include #include int main(int argc, char **argv) { int size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); int globaldata[8]; int localdata[2]; int counter, i; if (rank == 0) { for (i=0; i<size*2; i++)//initializing array to all zeros, […]

使用Cygwin的MPICH2编译问题

尝试使用Cygwin在Windows机器上编译MPICH2。 一些相关的信息 $ uname – > CYGWIN_NT-6.1 $ gcc –version – > gcc(GCC)3.4.4(cygming special,gdc 0.12,使用dmd 0.125)版权所有(C)2004 Free Software Foundation,Inc。这是免费软件; 查看复制条件的来源。 没有保修; 甚至不适用于适销性或特定用途的适用性。 MPICH2版本:1.5 配置似乎已经适当完成,但在编译期间我收到以下内容: **** Making src/misc …. make –no-print-directory build_lib_bin make –no-print-directory mpe_debug_objs make –no-print-directory /home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/mpe2/lib/libmpe_nompi.a make[7]: `/home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/mpe2/lib/libmpe_nompi.a’ is up to date. make –no-print-directory /home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/mpe2/lib/libmpe.a gcc -I/home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/include -I/home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/ src/include -I.. -I../include -I../../.. -I../../../include -o […]

MPI:在完成工作后帮助另一个人

这是我的问题: 给定一个初始间隔[a,b]进行并行化并假设流程比其他流程更快,我想做一个流程,当它完成其块(工作)时,我会“帮助”另一个(j),帮助这个case意味着在它和进程i(将要帮助的那个)之间平均分割进程j的块(它仍在工作的块)。 我已经了解了这个算法,但我不知道如何使用MPI通信function(如Broadcast,Allgather,send,recv)来实现它:我想使用所有进程共享的数组“arr” &size的大小等于所有进程的数量。 arr [i] = 1表示进程i已完成工作,否则等于-1。 我将其所有元素初始化为-1,当排名“rank”的进程完成其工作时,它确实arr [rank] = 1并且等待工作进程注意它并向它发送新块。 这是我想要实现的“伪代码”: MPI_Init ( &argc, &argv ); MPI_Comm_rank ( MPI_COMM_WORLD, &rank ); MPI_Comm_size ( MPI_COMM_WORLD, &nb_proc ); int i; int a = 0, b = max; //initial interval [a,b] to parallelize int j; arr[nb_proc]; for(j = 0; j < 10; j++) { arr[j] = […]

打开MPI以在PGM文件中分发和操作2d数组

我需要使用Open MPI在10台正在运行的计算机中分配PGM文件中的2darrays。 然后我需要操纵数组的每个值以获得负图像(255-i),然后打印输出。 我正在考虑使用mpi_scatter和mpi_gather来分发数据。 现在的问题是如何将二维数组读入子数组并将子数组发送到每个工作计算机来进行操作。 我正在用C编写这个程序。 任何人都可以帮我解决这个问题或提出想法吗? 谢谢。 以下是PGM文件中的数组示例: P2 #由’xv balloons_bw.tif’创建 640 480 255 232 227 220 216 212 209 207 206 205 205 205 207 208 209 210 211 212 211 211 213 212 211 210 209 210 210 211 212 211 210 210 210 210 211 210 210 210 210 209 210 […]

如何在MPI_Comm_split之后分配句柄?

说,我有8个进程。 当我执行以下操作时,MPU_COMM_WORLD通信器将被分成两个通信器。 具有偶数id的进程将属于一个通信器,具有奇数id的进程将属于另一个通信器。 color=myid % 2; MPI_Comm_split(MPI_COMM_WORLD,color,myid,&NEW_COMM); MPI_Comm_rank( NEW_COMM, &new_id); 我的问题是这两个传播者的手柄在哪里。 拆分之后,处理器的ID为0 1 2 3 4 5 6 7将变为0 2 4 6 | 1 3 5 7。 现在,我的问题是:假设我想在特定的通信器中发送和接收,比如托管偶数ID的那个,然后当我使用错误的通信器从0到2发送消息时,消息可能最终在第二个通信器中,它是否正确? 提前谢谢您的澄清! if(new_id < 2){ MPI_Send(&my_num, 1, MPI_INT, 2 + new_id, 0, NEW_COMM); MPI_Recv(&my_received, 1, MPI_INT, 2 + new_id, 0, NEW_COMM, MPI_STATUS_IGNORE); } else { MPI_Recv(&my_received, 1, MPI_INT, […]

奇怪的全局变量行为,一旦变量名称被更改,问题就会消失

在我的大学练习中,我遇到了变量的奇怪行为。 /* Main parameters */ double sizeX, sizeY; /* Size of the global domain */ int nPartX, nPartY; /* Particle number in x, y direction */ int nPart; /* Total number of particles */ int nCellX, nCellY; /* (Global) number of cells in x, y direction */ int steps; /* Number of timesteps */ double […]