回 帖 发 新 帖 刷新版面

主题:串行可以输出结果,并行计算结束没有输出,要修改输出路径吗?

大家好。感谢论坛上的各位好友对我的帮助。

昨天并行运算弄好了,速度确实快了很多,以前要30小时算完的程序,现在10小时左右就可以了。但是计算完成之后,我发现输出文件没有数据。这是怎么回事呢?

串行 计算的时候我都是把输出输出到一个文件下,改成并行计算了,语句没有修改,是不是并行情况下要对输出语句修改一下啊?

 

谢谢!

回复列表 (共2个回复)

沙发

有热心网友给出了下面的回答:

并行之前将数据broadcast到每个core,分别计算
你要写文件之前,需要将数据重新collect到同一个core来写文件,因为每个core的运算不可能同时结束,所以需要synchronization
如果涉及文件读写,基本框架是:

master读文件
broadcast/划分数据给children
所有children并行运算
collect数据到master(同步)
master写文件

而且给了一个c语言的例子:
谁可以将它转成fortran?
最好带输出文件的,最后写到一个文件里

#include "mpi.h"

#include <stdio.h>

int main(int argc, char *argv[] ) {


 int numprocs, rank, chunk_size,chunk_extra i,j;

 int max, mymax,rem;

 int matrix[800][800];

 int vector[800];

 int local_matrix[800][800];

 int result[800];

 int global_result[800];
 MPI_Status status;
 
 /* 初始化 */
 MPI_Init( &argc,&argv);
 MPI_Comm_rank( MPI_COMM_WORLD, &rank);
 MPI_Comm_size( MPI_COMM_WORLD, &numprocs);

 printf("Hello from process %d of %d \n",rank,numprocs);
    chunk_size = 800/numprocs;
 
 if (rank == 0) { /* Only on the root task... */
 /* 初始化矩阵和向量*/
  for(i=0;i<800;i++) {
   vector[i] = i;
     for(j=0;j<800;j++) {
    matrix[i][j] = i+j;
     }
  }
 }

 /* 分发向量*/
   /*  每个都要*/
 MPI_Bcast(vector,800,MPI_INT,0,MPI_COMM_WORLD);
   
 /* 分发矩阵 */
 /* 行数/处理器数目*/
   /* 每一块是800×chunk_size */ 
 MPI_Scatter(matrix,800*chunk_size,MPI_INT,local_matrix,800*chunk_size,MPI_INT, 0,MPI_COMM_WORLD);

   /*开始工作,即进行乘法,生成部分向量 */
   for(i=0;i<chunk_size;i++) {
  result[i]=0;
    for(j=0;j<800;j++) {
          result[i] += local_matrix[i][j]*vector[j];
  }
 }

   /*归约*/ 
 MPI_Gather(result,chunk_size,MPI_INT,global_result,chunk_size,MPI_INT, 0,MPI_COMM_WORLD);

 /*显示结果 */
 if(rank==0) {
  for(i=0;i<800;i++) {
   printf(" %d \t ",global_result[i]);
  }
   }

 MPI_Finalize();
 return 0;
}

 










板凳

问题找到了。我的程序串行的时候最大内存占到48%,并行运算,8个节点,我发现每个节点占内存占到了12%多,妈呀,内存占满了,然后再继续运算的话就退出了。
很奇怪,串行运算内存48%,8个节点同时运算的话每个节点占内存应该在8%吧?怎么会达到12%呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册