c - 多线程 - 光线追踪器

标签 c arrays multithreading variables optimization

我现在已经完成了我的光线追踪器,但我正在尝试学习线程来优化渲染时间。使用 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 *)你可以看到每个线程对数组有一个影响区域(实际数组部分的开始位置到结束位置)。

如果每个线程都在特定部分工作,这可能吗?

感谢您的回复。

最佳答案

是的,可以有一个多线程光线追踪器,所有线程都写入同一个输出缓冲区而无需额外同步,如果:

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

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

我通常将每个线程设置为在图像中单独一行。当一个人完成一行时,我让它在下一个未分配的行上工作。以这种方式分发这些部分确实需要一些同步,但这是非常小的,通常不会引起激烈的争用。

关于c - 多线程 - 光线追踪器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482448/

相关文章:

c - 如果该目录不存在,POSIX系统上是否可以自动创建目录?

javascript - 直接插入的数组长度

java - 打印字符串数组字典顺序中第一个元素时出现问题(java)

java - 收集线程中的值并将其保存到 java 套接字数组中

c - 将字符串值赋给指针

c - 发生超时。 2s 仅可用

c - 如何将 C 库函数加载到汇编中,并在另一个 C 或汇编项目中使用汇编库函数

php - 模拟数组在数据库中存储字符串

java - TOCTOU 中的竞争条件是如何工作的?

android - 如何判断代码是否需要在 UI 线程上运行