我现在已经完成了我的光线追踪器,但我正在尝试学习线程来优化渲染时间。使用 int8_t *(4 int8_t/R/G/B/A 像素)表示我的窗口的每个像素。这是我正在尝试做的示例:
设置的线程数:4
[0]-------- 1 [2]--------[3][4]--------[5][6]------[7]
[线程 1][线程 2][线程 3][线程 4]
对于 8 个数组,每个线程占用 2 个单元格,但我希望它们在数组上同时工作。如果每个线程都在特定部分工作,这可能吗?
在此screen (ptr * 是 int8_t *)你可以看到每个线程对数组有一个影响区域(实际数组部分的开始位置到结束位置)。
如果每个线程都在特定部分工作,这可能吗?
感谢您的回复。
最佳答案
是的,可以有一个多线程光线追踪器,所有线程都写入同一个输出缓冲区而无需额外同步,如果:
- 输出数组没有移动。
- 线程写入的数组部分不重叠。
- 在某些平台上,您可能还必须确保线程永远不会尝试未对齐的写入,这表明让一个线程写入红色 channel 而另一个线程写入同一像素的绿色 channel 并不是一个好主意。
为了获得最佳性能,您可能不希望两个线程同时尝试写入同一缓存行。与其让线程在数组中跳跃,不如考虑将图像分割成更大的连续 block 。
我通常将每个线程设置为在图像中单独一行。当一个人完成一行时,我让它在下一个未分配的行上工作。以这种方式分发这些部分确实需要一些同步,但这是非常小的,通常不会引起激烈的争用。
关于c - 多线程 - 光线追踪器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482448/