C语言 使用 MPI_Gather 的断言失败



我正在尝试编写重复执行计算并将其结果保存到单个数组中的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

相关内容

  • 没有找到相关文章

最新更新