划分并行处理的位图

问题描述 投票:0回答:1

我如何将位图划分为段并用于并行处理?我已经有位图的高度和宽度但是从这里开始。我读过使用MPI_Cart_shift()MPI_Sendrecv()。但是,我不确定如何使用它们。

  width = BMP_GetWidth (bmp);  
  height = BMP_GetHeight (bmp);
  new_bmp = BMP_Create(width, height, 24); // BMP_Create(UINT width, UINT height, USHORT depth)
c mpi bmp gaussianblur
1个回答
1
投票

我如何将位图划分为段以用于并行处理取决于正在进行的处理类型。

你的标签(但不是你的问题)提到高斯模糊,所以这可能是一个很好的起点。

对于高斯模糊,每个输出像素取决于许多输入像素而不是其他任何内容。如果每个处理器都有一个(只读)所有输入像素的副本,那么你可以随意拆分工作,但“绑定”最有效。具体地,如果存在N个处理器,则第一处理器将找到第一组“total_pixels / N”输出像素(其可能是图像顶部的像素带),第二处理器将执行第二组“total_pixels / N”输出像素(可能是第一个频段正下方的像素带),等等。完成所有处理器后,您只需按正确的顺序附加每个处理器的输出像素,即可获得整个输出位图。

注意(由于四舍五入),一些处理器可能需要做不同数量的像素 - 例如,如果位图有10000像素而你有64个处理器,那么“10000/64 = 156.25”但处理器不能做四分之一像素,所以最终得到48个处理器做156像素,而16个处理器做157像素( “48 * 156 + 16 * 157 = 10000”)。

此外,如果处理器可能具有不同的速度和/或不同的延迟,您可能希望将工作分成更多部分(例如,如果有64个处理器将工作分成128个部分,其中较慢的处理器可能只执行1个部分,而较快的处理器可能做4件)。

如果处理器还没有所有输入像素的副本(如果没有共享内存),那么您可以向每个处理器发送所有像素的一小部分。例如,如果你有一个7行高的高斯矩阵(输出位置上方3行,输出位置上有一行,输出位置下方有3行),如果每个处理器输出100行像素的带,那么你需要为每个处理器发送一个“3 + 100 + 3 = 106”频段的输入像素(除了处理第一个频段和最后一个频段的处理器,只能获得“3 + 100”或“100+”) 3“行输入像素)。

对于像(例如)Floyd-Steinberg这样的东西,抖动事情变得复杂得多,因为一个输出像素取决于所有先前的输出像素(除了输入像素)。在这种情况下,您可以将“3色”位图分成三个单独的单色位图(每个处理器一个,最多3个处理器),每个处理器可以抖动其单色位图,然后您可以将三个生成的单色位图合并在一起获得单个“3色”输出位图;但实际上不可能使用3个以上的处理器(不需要更改为更适合并行化的不同抖动算法)。

要绘制一个圆或一个椭圆,您可以让每个处理器绘制一个圆弧并组合圆弧;为了绘制1234个形状,您可以将图像分割成网格,并让每个处理器在网格中进行切片。

© www.soinside.com 2019 - 2024. All rights reserved.