我正在尝试编写重复执行计算并将其结果保存到单个数组中的MPI C代码,以便降低输出频率。下面的示例代码(var 的大小 200 足以满足正在使用的 CPU 数量):
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv){
float *phie, *phitemp, var[200];
int time=0, gatherphi=10, gatherfile = 200, j, iter=0, lephie, x;
int nelecrank = 2, size, rank, Tmax = 2000;
FILE *out;
MPI_Init(&argc, &argv) ;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
lephie = gatherfile/gatherphi; // number of runs of calculation before output
// allocate memory
//printf("%d Before malloc.n", rank);
if (rank==1) phie=(float *) malloc(nelecrank*size*gatherfile/gatherphi*sizeof(float));
phitemp=(float *) malloc(nelecrank*sizeof(float));
//printf("%d After malloc.n", rank);
for(j=0;j<200;j++) var[j]=rank;
for(time=0;time<Tmax;time++){
if (!time%gatherphi) {// do calculation
for (j=0;j<nelecrank;j++) { // each processor does the calculation nelecrank times
phitemp[j]=0;
for (x = 0; x<=4; x++) {
phitemp[j]=phitemp[j]+var[rank+j*size];
}
}
} // end of j for loop
printf("iter: %d, %d Before MPI_Gather.n", iter, rank);
MPI_Gather(phitemp, nelecrank, MPI_FLOAT, phie+iter*nelecrank*size*sizeof(float), nelecrank, MPI_FLOAT, 1, MPI_COMM_WORLD);
iter++;
} // end of gatherphi condition
if (time % gatherfile) { //output result of calculation
iter=0;
if (rank==1) {
out = fopen ("output.txt", "wt+");
if (out == NULL) {
printf("Could not open output file.n");
exit(1);
}
else printf("Have opened output file.n");
for (j=0;j<nelecrank*size*lephie;j++) {
fprintf(out,"%f ",*(phie+j*sizeof(float)));
}
fclose(out);
}
} // end of file output
if (rank==1) {
if (phie) free (phie);
}
if (phitemp) free (phitemp);
MPI_Finalize();
return 0;
}
它给我重复的内存分配问题,直到它最终退出。我没有在 MPI 中使用内存分配的经验 - 你能帮忙吗?
非常感谢,玛尔塔
基本上,phie
不够大。
你malloc
nelecrank*size*gatherfile/gatherphi*sizeof(float)=80*sizeof(float)
记忆phie
.
但是,您的MPI_Gather
使用需要iter*nelecrank*size*sizeof(float)+nelecrank*size*sizeof(float)
内存。 iter
取的最大值为nelecrank*Tmax-1
,所以phie
需要(nelecrank*Tmax-1)*nelecrank*size*sizeof(float)+nelecrank*size*sizeof(float)
,大约8000*size*sizeof(float)
大。
也许您想在某个地方重置循环中的iter=0
?