簡體   English   中英

可以分發或並行處理順序程序嗎?

[英]Possible to distribute or parallel process a sequential program?

在C ++中,我編寫了一個數學程序(用於擴散受限聚合),其中計算出的每個新點都取決於所有先前的點。 是否可以使這種程序以並行或分布式方式工作以提高計算速度? 如果是這樣,我需要研究哪種類型的代碼修改?

編輯:我的源代碼可在... http://www.bitbucket.org/damigu78/brownian-motion/downloads/文件名是DLA_full3D.cpp我不介意重大重寫,如果那樣做。 畢竟,我想學習如何做。

如果您的算法從根本上說是順序的,那么就不能從根本上做到這一點。

您正在使用什么算法?

編輯:谷歌搜索“並行擴散限制聚合算法”導致我在這里 ,並帶有以下引號:

另一方面,已顯示DLA [9,10]屬於固有順序的或更正式的P完全問題。 因此,當限制為系統大小的多項式處理器數量時,不可能在多對數時間中並行采樣DLA群集。

因此,您的問題的答案是“所有跡象都指向否”。

大概。 大多數順序算法都有並行版本,對於那些不能立即並行化的順序算法,通常有並行替代方案。 這似乎是您在選擇算法之前需要考慮並行化或並行性的情況之一。 但是除非您告訴我們有關您的算法的更多(很多?)信息,否則我們將無法提供太多具體的指導。 如果讓您感到有趣,那么SOers在缺乏硬數據的情況下爭論不休,請坐下來觀察,但是如果您想要答案,請編輯您的問題。

toxiclibs網站提供了一些有關如何完成DLA實施的有用見解

cilk ,它是C語言的增強功能(不幸的是還沒有C ++),它允許您向代碼中添加一些額外的信息。 僅需少量提示,編譯器就可以自動並行化代碼的各個部分,例如並行而不是串行運行for循環的多個迭代。

在不了解您的問題的情況下,我只想說這看起來像是實現並行前綴掃描( http://en.wikipedia.org/wiki/Prefix_sum )的不錯選擇。 最簡單的示例是一個數組,您要使用該數組求和:

1 5 3 2 5 6

1 6 9 11 16 22

這看起來本質上是串行的(因為所有點都取決於先前的點),但是可以並行完成。

您提到每個步驟都取決於前面所有步驟的結果,這使得並行處理此類程序變得困難。

我不知道您使用的是哪種算法,但是您可以使用多線程加速。 每個線程將處理一個步驟,但是必須等待尚未計算出的結果(盡管如果它們不隨時間改變值,則可以與已經計算出的結果一起使用)。 從本質上講,這意味着您必須使用鎖定/等待機制才能等待尚未計算但某個工作線程當前需要繼續執行的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM