gpt4 book ai didi

c - 打开 MPI 以分发和操作 PGM 文件中的二维数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:50 25 4
gpt4 key购买 nike

我需要使用 Open MPI 将 PGM 文件中的二维数组分布到 10 台工作计算机中。然后我需要操纵数组的每个值以获得负像 (255-i),然后将输出打印回来。我正在考虑使用 mpi_scattermpi_gather 来分发数据。现在的问题是如何将二维数组读入子数组并将子数组发送到每台工作计算机进行操作。我正在用 C 编写这个程序。

谁能帮我解决这个问题或者给点意见?谢谢。

PGM文件中的数组示例如下:

P2# created by 'xv balloons_bw.tif'640 480255232 227 220 216 212 209 207 206 205 205 205 207 208 209 210 211 212 211 211 213 212 211 210 209 210 210 211 212 211 210 210 210 210 211 210 210 210 210 209 210 209 208 209 208 209 210 209 208 210 209 209 208 208 208 209 208 208 208 207 207 207 206 207 207 207 207 207 207 207 207 207 207 205 204 206 205 205 204 204 204 203 202 203 202 201 201 201 200 199 199 200 199 198 198 198 197 197 198 197 196 195 195 194 193 192 192 191 191 190 190 190 190 189 189 190 188 188 188 187 187 187 186 186 186 186 187 186 186 187 188 188 187 186 186 186 185 186 186 186 187 186 186 186 185 185 187 186 185 186 185 185 186 185 184 185 186 185 186 186 186 185 186 185 185 185 184 183 184 184 183 

最佳答案

读取 PGM 文件的最简单方法是使用 libpgm来自 netpbm包。

您使用以下方式读取 pgm 文件:

gray **image;
FILE *fp;
int cols; # num columns
int rows; # num rows
int maxval; # max grayscale value

fp = fopen("input.pgm","r");
image = pgm_readpgm( fp, &cols, &rows, &maxval);

您现在可以通过遍历行/列来获得负片图像:

for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
image[i][j] = maxval - image[i][j];

棘手的一点是在 MPI 节点之间分配任务,因为 image 在内存中可能不连续(我没有检查过)。可以深入研究 the code确定存储模式并相应地分散/聚集数组,但是不能保证它不会在将来发生变化(不太可能,但可能)并破坏您的代码。

一种可能但非最佳的方法是创建一个在内存中连续的临时缓冲区,分发它,然后重建图像。例如

gray *buffer = malloc(sizeof(gray) * rows * cols);
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
buffer[(i*cols)+j] = image[i][j];

现在,我们准备好

  1. 跨节点分散缓冲区
  2. 您可能需要向每个节点广播maxval
  3. 每个节点执行 buffer[n] = maxval - buffer[n];
  4. 将缓冲区收集回 master
  5. 重建输出图像

您可以通过将图像写回image 数据来重建图像,或者如果您熟悉the format,则只需手动打印pgm 文件即可。

至于用于 MPI 操作的数据类型,MPI_UNSIGNED 可以工作,因为 graya typedef of unsigned int .但是,为了严格向前兼容,您可以使用 MPI_BYTE 并将您的 send_count 乘以 sizeof(gray)

不使用 libpgm

如果您想手动读取文件,这并不难,因为您的 PGM 文件是普通格式(P2 而不是 P5)。

假设格式有效,您需要:

  1. 打开文件
  2. 跳过前两行
  3. 读取列和行:fscanf(fp,"%d %d", &cols, &rows);
  4. 读入 maxval :fscanf(fp,"%d", &maxval);
  5. 根据colsrows 分配缓冲区
  6. 通过遍历列/行并重复读取图像的其余部分 fscanf(fp,"%d", &buffer[r][c]);

关于c - 打开 MPI 以分发和操作 PGM 文件中的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075379/

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