2013-04-10 62 views
0

我对并行计算了解不多,但是我想对任务中的“进一步工作”提出建议并希望确保我是正确的。 我已经用C++写了一个光线跟踪器。我在vector中存储射线信息(例如命中点),并在模拟结束时将这些向量写入CSV(这是不错的编程?)如果我跟踪了一些射线,说1000,与跟踪相比,仿真需要更多时间100次射线10次。我认为这是因为我的vector's的大小更大,所以它们在堆内存(?)中占用大量空间。每条射线都可以在没有来自其他射线的信息的情况下追踪(该节目正在乞求并行)。我正确的是说,如果程序是并行的,每个处理器都有它自己的内存,那么不会是一个占用大量内存的大型向量,而是可以更有效地处理的小向量?内存使用并行编程

+0

或者也许让程序通过线程('std :: thread')允许并行执行。 – Mushy 2013-04-10 17:10:27

+1

很可能您在1x1000和10x100测试中使用了不同的光线。如果是这样,我会调查相同的光线正在测量他们的时间。我愿意赌一个不那么小的身体部位,以致向量的大小完全不相关。主存储器速度以GB/s为单位进行测量 - 额外元素的“一对”(一千或几百万)对执行速度没有明显影响。为什么不编写一些分析代码来查看向量的速度(或查找其他人的结果)QueryHighPerformanceFrequency和QueryHighPerformanceTimer - 在Windows上工作时都很方便。 – enhzflep 2013-04-10 17:18:05

+0

好的 - 基本上回答了我的问题。与较小的矢量相比,几百万个元素的矢量不会显着影响模拟。谢谢 – Seb 2013-04-10 17:39:46

回答

1

假设每个处理器都有自己的“内存”,这听起来像是尝试提高CPU高速缓存的使用率(不管您的任务如何并行,RAM都保持不变 - 除非您将它分布到群集上)。虽然一般情况下并行化会提供更多的CPU缓存,但是由于线程在内核之间迁移(Windows实际上会这样做),因此可能会有更多的缓存未命中。

也许你只是以低效的方式使用std :: vector。例如。您将在开始处插入项目或逐个追加项目(这些操作可能会占用O(vector.size()))。或者可能存在其他数据结构,其在光线数量增加时减慢。这可能可以在几个处理器之间不分裂任务的情况下解决。

尽管程序肯定会从并行化中获益。

+0

这正是我所做的。我从来没有被要求'处理'我的结果,所以我花了很多精力来有效地跟踪场景中的光线。但是为了显示我正在做的事实际上是正确的,每次光线碰到一个物体时,我都会追加一个带有该生物体坐标的“矢量”并继续计算。最后,我将该矢量写入csv并使用Matlab来绘制漂亮的图片 - 是否有快速修复的方法? – Seb 2013-04-10 17:38:08

+0

矢量中元素的最终数目是多少?您可以将向量的容量设置为该数字(或稍大一些)以避免在追加新元素时重新分配内存:'your_vector.reserve(1000000);'(假设您将存储最多1000000个项目) 更智能的方式可能是这个输出数据有一个合理大小的缓冲区,并最终将其刷新到CSV文件,而不是将所有内容存储在RAM中,并在最后进行一次大的写入。 – Inspired 2013-04-10 17:44:51

+0

我曾考虑调整矢量大小,但不幸的是,光线可能会在场景周围发生反弹,所以生命值的数量将远远大于物体的数量。对于缓冲区,我是否了解你:我有一个'vector.reserve(100000k)',并且当它达到容量时,我经常将它写入CSV中? – Seb 2013-04-10 17:50:21