我正在尝试使用MPI构建一些东西,所以因为我不熟悉它,所以我从一些数组和打印开始。我注意到一个简单的C命令(不是MPI命令)同时在每个进程上工作,即打印类似的东西:
printf("Process No.%d",rank);
他们注意到进程的数量全部被扰乱,因为正确的进程序列适合我,我尝试使用类似的for循环:
for(rank=0; rank<processes; rank++) printf("Process No.%d",rank);
这在我的电脑中开始了第三次世界大战。很多奇怪的错误,我无法理解,这让我很怀疑。怎么可能因为if-loop声明了一个排名值,比如主等级:
if(rank==0) printf("Process No.%d",rank);
由于同样的原因,不能使用for循环。嗯,这是我的第一个问题。
我的第二个问题是关于我使用的另一个for-loop,它被忽略了。
printf("PROCESS --------------->**%d**\n",id);
for (i = 0; i < PARTS; ++i){
printf("Array No.%d\n", i+1);
for (j = 0; j < MAXWORDS; ++j)
printf("%d, ",0);
printf("\n\n");
}
我运行for循环,每个进程只打印第一行:
$ mpiexec -n 6 `pwd`/test
PROCESS --------------->**0**
PROCESS --------------->**1**
PROCESS --------------->**3**
PROCESS --------------->**2**
PROCESS --------------->**4**
PROCESS --------------->**5**
而不是以下数量的零(最初有一个数组,我删除因为我试图找出它为什么没有打印)。
那么,为什么它与MPI和for循环不相处?
- 编辑1:语法 - 编辑2:代码粘贴
它与上面的不一样,但在fprintf的最后一个for循环中出现同样的问题。
This is a paste zone, sorry for that, i couldn't deal with the code system here
- 编辑3:修复
嗯,我终于明白了。首先,我必须说在MPI中使用fprintf函数是一团糟。显然,每个进程在文本文件中写入时都会有一种重叠。我使用printf函数测试它并且它工作。我正在做的第二件事是,我从内部调用MPI_Scatter函数:
if(rank==root) MPI_Scatter();
..只分散流程中的数据,而不是其他数据。
现在我已经解决了这两个问题,程序正常工作,除了我打印my_list数组时的一个小问题。似乎每个数组都有一个随机数量的输入,但是当我使用计数器测试每个数组时,它只是像这样打印的数据。尝试使用fflush(stdout);但它给我一个错误。
usr/lib/gcc/x86_64-pc-linux-gnu/4.2.2/../../../../x86_64-pc-linux-gnu/bin/ld: final link failed: `Input/output error collect2: ld returned 1 exit status`
答案 0 :(得分:3)
MPI本身对于for循环没有问题。但是,就像使用任何其他软件一样,您应该始终记住它将按照您编写代码的方式工作,而不是您想要的方式。看来你有两个不同的问题,这两个问题只与MPI相关。
第一个问题是变量PARTS
的定义方式使它依赖于另一个变量procs
,该变量未在前期初始化。这意味着PARTS
的值未定义,并且可能最终导致零除零。实际上应该在第44行之后设置PARTS
,procs
初始化。
第二个问题是标记为for(i = 0; i = LISTS; i++)
的循环/*Here is the problem*/
。首先,循环的测试条件始终将i
设置为LISTS
的值,而不管0
的初始值和循环结束。也许它的意图是i < LISTS
?其次,在初始化该变量之前,LISTS
的初始化方式取决于PARTS
,这取决于procs
。与PARTS
一样,LISTS
必须在第44行的MPI_Comm_size(MPI_COMM_WORLD, &procs);
语句后初始化。
编写循环时请更加小心。另外,请确保正确初始化变量。我强烈建议使用print语句(对于小程序)或调试器来确保将变量设置为预期值。