多线程 - 光线跟踪器

时间:2017-04-18 21:24:26

标签: c arrays multithreading variables optimization

我现在已经完成了我的光线跟踪器,但我正在尝试学习线程以优化渲染时间。使用int8_t *(对于R / G / B / A为4 int8_t /像素)来表示我的窗口的每个像素。以下是我尝试做的一个示例:

设置的线程数:4

[0] ------- 1 [2] ------- [3] [4] ------- [5] [6] --- ---- [7]
[线程1] [线程2] [线程3] [线程4]

对于8的数组,每个线程需要2个单元格,但我希望它们在数组上同时工作。如果每个线程在特定部分上工作,这可能吗?

在这个screen(ptr *是int8_t *)上,你可以看到每个线程对数组有一个影响区域(从实际数组部分的起始位置到结束位置)。

如果每个线程都在特定部分上工作,这是否可行?

感谢您的回复。

1 个答案:

答案 0 :(得分:2)

是的,可以使用多线程光线跟踪器,所有线程都写入相同的输出缓冲区而无需额外同步, if

  1. 输出数组没有移动。
  2. 线程写入的数组部分不重叠。
  3. 在某些平台上,您可能还必须确保线程永远不会尝试未对齐写入,这表明让一个线程写入红色通道而另一个线程写入同一像素的绿色通道并不是一个好主意。 / LI>

    为了获得最佳性能,您可能不希望两个线程同时尝试写入同一缓存行。不要让线程在数组中跳跃,而是考虑将图像分割成更大的连续块。

    我通常将每个线程设置在图像中自己的行上。当一个完成一行时,我让它在下一个未分配的行上工作。以这种方式提取部分确实需要一些同步,但这非常小,通常不会受到严重争用。