我对并行计算知之甚少,但我想就一项任务提出“进一步工作”的建议,并想确保我是对的。我用 C++ 编写了一个光线追踪器。我将光线的信息(例如命中点)存储在其中, vector
并在模拟结束时将这些向量写入 CSV(这是好的编程吗?)如果我跟踪多条光线,比如 1000 条,则与跟踪 100 条相比,模拟需要更多时间射线 10 次。我认为这是因为我的大小vector's
更大,因此它们在堆内存中占用了大量空间(?)。每条光线都可以在没有来自其他光线的信息的情况下被追踪(该程序正在乞求并行)。我是否正确地说,如果程序是并行的,每个处理器都将拥有自己的内存,因此不会有一个大向量占用一大块内存,而是散布在周围的小向量可以更有效地处理?
问问题
840 次
1 回答
1
您对每个处理器都有自己的“内存”的假设听起来像是试图提高 CPU 缓存使用率(无论您的任务有多并行,RAM 都保持不变 - 除非您将它分布在集群上)。虽然通常并行化提供了更多的 CPU 缓存,但由于线程将在内核之间迁移(Windows 实际上这样做),因此可能会有更多的缓存未命中。
也许您只是以低效的方式使用 std::vector 。例如,您在开头插入项目或逐个附加项目(这些操作可能需要 O( vector.size()
))。或者当光线数量增加时,可能存在其他数据结构变慢。这可能无需在多个处理器之间拆分任务即可解决。
尽管程序肯定会从并行化中受益。
于 2013-04-10T17:27:43.577 回答