【问题标题】:Noise with multi-threaded raytracer多线程光线追踪器的噪声
【发布时间】:2011-02-24 11:02:11
【问题描述】:

这是我的第一个多线程实现,所以可能是初学者的错误。线程处理每第二行像素的渲染(因此所有渲染都在每个线程内处理)。如果线程分别渲染屏幕的上部和下部,问题仍然存在。

两个线程都从相同的变量中读取,这会导致任何问题吗?据我了解,只有编写会导致并发问题......

调用相同的函数会导致任何并发问题吗?再说一次,据我了解,这应该不是问题......

两个线程唯一一次写入同一个变量是在保存计算的像素颜色时。这存储在一个数组中,但它们从不写入该数组中的相同索引。这会导致问题吗?

Multi-threaded rendered image (防止垃圾邮件阻止我直接发布图片..)

附言。我在这两种情况下都使用完全相同的实现,唯一的区别是为渲染创建了一个线程和两个线程。

【问题讨论】:

  • 你能发布一些代码吗?如果没有代码,回答您的问题很可能需要一个水晶球。不幸的是,并发问题通常非常非常微妙......

标签: c++ multithreading thread-safety raytracing


【解决方案1】:

两个线程都从相同的变量中读取,这会导致任何问题吗?据我了解,只有编写会导致并发问题......

这应该没问题。显然,只要在两个线程开始读取之前初始化数据,在两个线程完成后销毁。

调用相同的函数会导致任何并发问题吗?再说一次,据我了解,这应该不是问题......

是和不是。没有代码很难说。函数有什么作用?它是否依赖于共享状态(例如static 变量、全局变量、单例...)?如果是,那么这绝对是一个问题。如果从来没有任何共享状态,那么你就可以了。

两个线程唯一一次写入同一个变量是在保存计算的像素颜色时。这存储在一个数组中,但它们从不写入该数组中的相同索引。这会导致问题吗?

也许有时。什么数组? sizeof(element) == sizeof(void*) 可能是安全的,但是 C++ 标准在多线程上是静音的,所以它不会强制你的编译器强制你的硬件使其安全。您的平台可能会在这里咬您(例如 64 位机器和一个写入 32 位的线程,这可能会覆盖相邻的 32 位值),但这并不是一种不常见的模式。通常你最好使用同步来确定。

您可以通过以下几种方式解决此问题:

  • 每个线程都构建自己的数据,然后在完成时进行聚合。
  • 您可以使用mutex 保护共享数据。

我的回答缺乏承诺是多线程编程困难的原因:P

例如,来自 Intel® 64 and IA-32 Architectures Software Developer's Manuals,描述了不同平台如何保证不同级别的原子性:

7.1.1 保证原子操作

Intel486 处理器(和更新的 处理器自)保证 以下基本内存操作将 始终以原子方式执行:

  • 读取或写入一个字节
  • 读取或写入在 16 位边界上对齐的字
  • 读取或写入在 32 位边界上对齐的双字

奔腾处理器(和更新的 处理器自)保证 执行额外的内存操作 将始终以原子方式执行:

  • 读取或写入在 64 位边界上对齐的四字
  • 对适合 32 位数据总线的未缓存内存位置进行 16 位访问

P6 系列处理器(以及更新的 处理器自)保证 跟随额外的内存操作 将始终以原子方式执行:

  • 未对齐的 16 位、32 位和 64 位访问适合缓存行的缓存内存

对可缓存内存的访问 跨越总线宽度、缓存线、 和页面边界不保证 由 Intel Core 2 Duo 实现原子化, 英特尔凌动、英特尔酷睿双核、奔腾 M、 奔腾 4、英特尔至强、P6 家族、 奔腾和 Intel486 处理器。这 英特尔酷睿 2 双核、英特尔凌动、英特尔 酷睿双核、奔腾 M、奔腾 4、英特尔 Xeon 和 P6 系列处理器提供 总线控制信号,允许 外部存储器子系统使 拆分访问原子;然而, 非对齐的数据访问将 严重影响性能 处理器,应该避免使用。

【讨论】:

    【解决方案2】:

    我已经解决了这个问题,我按照 Stephen 的建议(不是 void* 大小的元素)分别为每个线程构建数据。感谢您提供非常详细的答案!

    【讨论】:

      猜你喜欢
      • 2014-06-18
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2015-02-05
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      相关资源
      最近更新 更多