主题:串行可以输出结果,并行计算结束没有输出,要修改输出路径吗?
tianhy2010
[专家分:60] 发布于 2012-08-28 08:23:00
大家好。感谢论坛上的各位好友对我的帮助。
昨天并行运算弄好了,速度确实快了很多,以前要30小时算完的程序,现在10小时左右就可以了。但是计算完成之后,我发现输出文件没有数据。这是怎么回事呢?
串行 计算的时候我都是把输出输出到一个文件下,改成并行计算了,语句没有修改,是不是并行情况下要对输出语句修改一下啊?
谢谢!
回复列表 (共2个回复)
沙发
tianhy2010 [专家分:60] 发布于 2012-08-28 21:21:00
有热心网友给出了下面的回答:
并行之前将数据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;
}
板凳
tianhy2010 [专家分:60] 发布于 2012-08-29 20:02:00
问题找到了。我的程序串行的时候最大内存占到48%,并行运算,8个节点,我发现每个节点占内存占到了12%多,妈呀,内存占满了,然后再继续运算的话就退出了。
很奇怪,串行运算内存48%,8个节点同时运算的话每个节点占内存应该在8%吧?怎么会达到12%呢?
我来回复