2013-04-10 64 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