gpt4 book ai didi

c - MPI Gather 没有按预期合并数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:29 27 4
gpt4 key购买 nike

我正在使用 MPI 开发 mandelbrot 生成器,它在完成时输出 PPM 文件。我使用 MPI gather 将计算结果 block 收集到最终数组中。代码生成文件但不完整;仅显示图片的上半部分。我哪里出错了?

计算代码:

     const int iXmax = 10000;
const int iYmax = 10000;
static unsigned char storeArray[25000000];
static unsigned char FstoreArray[10000*10000*3];

int chunk = (iYmax / p_num);
mystart = (iYmax / p_num) * my_rank;
if (iYmax % p_num > my_rank) {
mystart += my_rank;
myend = mystart + (iYmax / p_num) + 1;
} else {
mystart += iYmax % p_num;
myend = mystart + (iYmax / p_num);
}
printf("%i start %i end %i rank %i chunk\n\n",mystart,myend,my_rank,chunk);

for(iY=mystart;iY<myend;iY++)
{
Cy=CyMin + iY*PixelHeight;
if (fabs(Cy)< PixelHeight/2) Cy=0.0; /* Main antenna */
for(iX=0;iX<iXmax;iX++)
{

//Alternate between colors for saving in array
color1 = (iY*iXmax*3) + (iX*3)+0;
color2 = (iY*iXmax*3) + (iX*3)+1;
color3 = (iY*iXmax*3) + (iX*3)+2;

Cx=CxMin + iX*PixelWidth;
/* initial value of orbit = critical point Z= 0 */
Zx=0.0;
Zy=0.0;
Zx2=Zx*Zx;
Zy2=Zy*Zy;
/* */
for (iteration=0;iteration<iterationMax && ((Zx2+Zy2)<ER2);iteration++)
{
Zy=2*Zx*Zy + Cy;
Zx=Zx2-Zy2 +Cx;
Zx2=Zx*Zx;
Zy2=Zy*Zy;
};
/* compute pixel color (24 bit = 3 bytes) */
if (iteration==iterationMax)
{ /* interior of Mandelbrot set = black */
storeArray[color1]=0;
storeArray[color2]=0;
storeArray[color3]=0;
}
else
{ /* exterior of Mandelbrot set = white */
b=iterationMax-iteration; /* Blue */
g=b*b/iterationMax; /* Green*/
r=b*g/iterationMax; /* Red */
storeArray[color3]=b*pixelMax/iterationMax;
storeArray[color2]=g*pixelMax/iterationMax;
storeArray[color1]=r*pixelMax/iterationMax;
};
}
}


int sendDataCount = chunk*iXmax;

printf("Processor %d::Finished.\n", my_rank);

printf("Processor %d::Sending Buffer: %d.\n", my_rank ,sendDataCount);
MPI_Gather(storeArray, sendDataCount, MPI_UNSIGNED_CHAR, FstoreArray, sendDataCount ,MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
printf("MPI_Gather called on %d.\n", my_rank);
fflush(stdout);

文件写入:

  if calculations done and if rank == 0 do the following:

FILE * fp;
char *filename="cool_stuff.ppm";
char *comment="# mandel is a headache";/* comment should start with # */

/*create new file,give it a name and open it in binary mode */
fp= fopen(filename,"wb"); /* b - binary mode */
/*write ASCII header to the file*/
fprintf(fp,"P6\n %s\n %d\n %d\n %d\n",comment,iXmax,iYmax,pixelMax);

fwrite(FstoreArray,sizeof(FstoreArray),1,fp);
fclose(fp);
printf("array F %i, array S %i \n", sizeof(FstoreArray),sizeof(storeArray));

非常感谢任何帮助!文件输出是这个令人头疼的最后一部分,解决这个问题会让我的生活恢复秩序......

最佳答案

既然你正在使用 MPI,为什么不使用 MPI-IO 并一起绕过收集?你甚至不必做“我应该写在哪里?”通信步骤,因为每个人都有相同大小的数据(除了 rank 0,他可能会另外写出 ppm header ——我不知道 ppm 文件格式)

关于c - MPI Gather 没有按预期合并数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32031801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com