【问题标题】:Multithreading - Raytracer多线程 - 光线追踪器
【发布时间】:2017-04-18 21:24:26
【问题描述】:

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

设置的线程数:4

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

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

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

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

感谢您的回复。

【问题讨论】:

  • 我建议您看看其他一些关于 SO 的问题,这些问题涉及管理对数组的多线程访问,例如:stackoverflow.com/questions/14925294stackoverflow.com/questions/23315200
  • 我已经读过了,但这些并不能真正解决我的问题,谢谢你的帮助
  • 我很好奇 - 你为什么使用int8_t(而不是uint8_t)? “负数量的红色、绿色或蓝色”很少有任何意义。
  • 好建议,我的错误,谢谢!
  • 一般来说,线程只有在程序出现延迟时才真正有用,而其他一些“线程”仍然可以做有用的工作。操作数组(通常)不涉及延迟,因此多线程会由于上下文切换等原因导致程序变慢。

标签: c arrays multithreading variables optimization


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答,我会尽力完成它!
  • 作为一个优化新手:为什么两个线程写在同一个缓存行上会不好,我熟悉缓存未命中并没有看到问题。
  • 我不是专家,但我的理解是,如果两个内核尝试读取和写入同一缓存行,则可能会出现延迟,因为硬件会确保两个内核获得一致的视图缓存行。
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 2011-02-24
  • 2016-01-08
  • 2015-02-05
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多