2013-02-23 20 views

回答

5

我有一個多芯機,但是當我試圖運行這個舊的C 程序(http://www.statmt.org/moses/giza/mkcls.html)它只有利用 一個核。有沒有辦法運行C代碼並將週期/線程 發送到其他內核?

沒有重新編譯,絕對不是。

你也許可以做一些微小的調整,並使用一個能夠自動獲取源代碼並將其並行化的工具,但是由於每個核心是完全獨立的 - 它們「相距甚遠」 - 不能只傳播指令兩個核心之間。代碼必須以這樣一種方式進行編譯,即有兩個「指令流」 - 如果您只是將每條其他指令發送給雙核系統中的每個其他內核,那麼它​​的運行速度可能會比運行速度低10-100倍你在一個內核上運行所有的代碼,因爲所有需要的內核之間的通信都需要額外的開銷[每個內核已經能夠並行運行多條指令,而多核處理器的主要原因是首先這種並行運行方式的能力只有在提高速度的情況下才能實現 - 只有很多指令可以在需要前一條指令的結果之前運行,等等。

將代碼重新編碼爲CUDA的唯一方法?

不,還有很多其他的選擇。 OpenMP,使用多線程手動編碼。或者,最簡單的方法是,用不同的輸入數據啓動程序兩到四次,讓它們完全分開運行。這顯然只適用於如果有東西可以同時運行多個變體...

關於「使事情平行」的一句話。加快所有代碼並不是一件神奇的事情。計算一些你需要前面計算結果的東西是相當無望的 - 比如說你想計算斐波那契數列 - f(n) = f(n-1) + f(n-2) - 你不能用並行計算來做到這一點,因爲你需要其他計算的結果,繼續這個。另一方面,如果你有十幾個非常大的數字,你想檢查它們是否是素數,那麼你可以用4核心處理器和四個線程快四倍。

如果你有一個大的矩陣需要乘以另一個大的矩陣或向量,這將是理想的分裂,所以你做每個核心的計算的一部分。

我沒有看過你的特定項目的代碼,但只看着描述,我認爲它可能並行很好。

5

是的,這被稱爲自動並行化,它是一個活躍的研究領域。

但是,我知道沒有免費的工具。維基百科文章"automatic parallelization"有一個工具列表。您將需要訪問原始源代碼,並且您可能必須向代碼添加並行化指令。

0

您可以在多個進程中運行它,並另寫程序,轉發任務,其中的任一過程。

CUDA?如果你想讓它在你的圖形卡上運行,你只需要這樣做,所以在這種情況下這是沒有意義的。

相關問題