【问题标题】:How to parallelize a for loop如何并行化for循环
【发布时间】:2016-11-13 11:14:23
【问题描述】:

我尝试并行化这个 for in for 循环,因为我想在 java 中使用 parallel stream 的代码强>。问题是..每次我尝试这样做时,我都没有得到整个结果。我的意思是......这段代码应该以某个角度旋转图像,但如果我正在执行 parallelize,我将只收到旋转图像的一半。

【问题讨论】:

  • 你为什么不给我们看看不起作用的并行代码?
  • 我现在已经添加了我的 main 和我的函数
  • 你应该添加你的代码:))

标签: java image-processing parallel-processing java-stream


【解决方案1】:

一个问题可能是在 for 循环之外声明的 a、b、xx、yy 变量。可能是不同的(交错的)迭代覆盖了这些变量的值。例如,

  1. 迭代 0 写入 a 和 b
  2. 迭代 0 停止,迭代 1 开始并写入 a 和 b
  3. 调度程序返回到迭代 0,但 a 和 b 的值现在是来自迭代 1 的值。

【讨论】:

  • 不,不是那样...我已经把这个变量放在我的 for 中,然后...什么也没发生
【解决方案2】:

我认为这个实现存在一些问题。

1) 来自 parallelstream 的每个线程都将覆盖另一个线程所做的 ImageIo.write。

2) 另外,forEach 是无序的,所以你不知道哪一半会先发生。

我认为您最好使用 Stream API 中的 collect 方法。如果您需要帮助,我可以提供一些代码。但是,如果您在问题中给我一个可测试的代码,我将编写并行收集操作。否则,一切顺利。


编辑

我做了一些检查,发现你的rotateImage 是罪魁祸首。该问题与parallelStream 无关。每个点 (x1,y1) 都需要进行大量转换,我现在编写代码有点太多了。您的算法应注意以下事项:

  1. 您需要计算图像的新高度和宽度 你顺时针旋转 90 度你的 destHeight = srcWidth 和 反之亦然。
  2. 首先你必须围绕原点旋转你的点 (x0,y0)
  3. 不仅需要将点 (x1,y1) 转换到新坐标系
    1. 这个新坐标系的原点位于图像的左上角,因此您不仅要旋转,还要将点转换到这个新坐标系。
    2. 另外,请注意,在您编写的旋转方程中,您可能假设 x 向右增加,y 向顶部增加,但是当您将图像写入像素时,您的 xx 向右增加,但 yy 向着增加底部(而不是顶部)。

一旦您处理完每个像素的所有这些平移和旋转以及缓冲区的高度和宽度,在 rotateImage 函数中,我认为您只需在位置流上调用 parallelStream 函数,您就不会遇到问题。

像 OpenGL 这样的一些库可以让您更轻松地完成这项工作。他们负责使用旋转向量和平移向量围绕中心旋转和平移每个像素向量。

【讨论】:

  • K,我已经发布了您需要的所有内容。如果你能为我并行化它,我会很高兴。 :D
  • 当然让我试试。嗯。没有足够的代码使其可编译...无论如何,您至少可以提供 1) 说明文件以查看您的度数和旋转度,还有 rotateImage 函数吗?想知道问题是否只是在 rotateImage 函数中。
  • 当然,旋转图像的代码是否已经存在,从这里你可以得到operations file。现在知道了吗?
  • 所以你可以用这个做点什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2013-09-02
  • 2016-07-23
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多