我想實現openMP,但是像我之前的很多其他海報一樣,結果只是簡化了代碼。受到以前答案的啓發,我從#pragma omp parallel for
到#pragma omp task
去了,希望能避免一些開銷。不幸的是,並行代碼仍然是串行速度的兩倍。從其他答案看來,正確的過程似乎取決於代碼的具體要求,這就是爲什麼我認爲我必須自己提問。使用openmp更好
第一僞代碼:
#pragma omp parallel
{
#pragma omp master
while (will be run some hundreds of millions of times)
{
for (between 5 and 20 iterations)
{
#pragma omp task
(something)
}
#pragma omp taskwait <- it is important that all the above tasks are completed before going on
(something)
if (something)
{
(something)
for (between 50 and 200 iterations)
{
#pragma omp task
(something)
}
#pragma omp taskwait
(something)
}
}
}
只有兩個for循環可以並行,其餘的必須按正確的順序進行。我想出了將while和master指令放在while循環之外的嘗試,以減少創建團隊的開銷。
我也有點好奇我是否正確使用了taskwait - 規範說明「父任務」被擱置,直到所有的子任務都被執行完畢,但這個術語是否也適用於此,任務區域不嵌套。
任何人都可以想出一個更好的方式使用openMP,這樣我實際上可以加快速度嗎?
編輯:while循環中的每一步都依賴於前面的所有步驟,因此它們必須連續完成,並在最後進行更新。如果有人想知道,它是模擬神經網絡的「事件驅動算法」的實現。
for循環的每次迭代需要多長時間?如果任務規模很小,很可能無法在這裏獲得加速。此外爲什麼'#pragma omp task'會更快,然後'#pragma omp for'?畢竟後者應該能夠以更少的管理開銷逃脫。對我來說,似乎如果速度更快,那麼您的情況可能使用了錯誤的調度模式。關於taskwait:據我瞭解,'master'部分應該是你的父任務(或者'parallel'部分,但似乎不太可能) – Grizzly 2012-02-19 19:43:49
我知道任務會更快,因爲對一個老問題的回答說了些什麼「如果for循環中的迭代次數太少,則最好使用任務代替」。在序列情況下,1.7秒內可能經歷10000次while循環。考慮到其他設置,對於第二個for循環的每次迭代,球估計將爲1.0-0.5微秒。我知道它很短,但被告知我低估了並行化的力量,並決定給它一個鏡頭:) – Kaare 2012-02-19 19:54:02
這聽起來好像你需要考慮新算法或新的並行處理範例,或者可能甚至兩個。 – talonmies 2012-02-19 20:07:34