有人可以請我提供一些建議,說明如何通過多線程減少循環的運行時間?假設我也有兩個叫做'a'和'b'的向量。向量的並行總和
for (int j = 0; j < 8000; j++){
// Perform an operation and store in the vector 'a'
// Add 'a' to 'b' coefficient wise
}
這個for循環在我的程序中執行了很多次。上面的for循環中的兩個操作已經過優化,但它們只能在一個內核上運行。但是,我有16個內核可用,並希望使用它們。
我試着修改循環如下。我沒有矢量'a',而是有16個矢量,並且假設第i個矢量被稱爲[i]。我的for循環,現在看起來像
for (int j = 0; j < 500; j++){
for (int i = 0; i < 16; i++){
// Perform an operation and store in the vector 'a[i]'
}
for (int i = 0; i < 16; i++){
// Add 'a[i]' to 'b' coefficient wise
}
}
我使用OpenMP的每個的for循環中通過添加「OMP的#pragma爲平行」每個內部循環之前。我所有的處理器都在使用中,但運行時間僅顯着增加。有沒有人有關於如何減少此循環的運行時間的任何建議?先謝謝你。
你是否分析過你的代碼,看看瓶頸在哪裏? – GWW 2011-06-05 06:04:39
這可能是因爲可能在優化代碼之後,代碼不能被分解成更小的代碼片段,如果你的原始代碼只做'a [i] + = b [i]',那麼你可以在那之前添加該編譯標籤對於。它會提高你的表現,如你所想。 – Ali1S232 2011-06-05 06:06:41
如果你的循環體非常微不足道,那麼你很可能受到內存帶寬的限制,而更多的內核將無濟於事(因爲內存帶寬已經飽和)。重新安排在更高層次上,以找到循環內部需要做的更多工作,或者獲得具有更快內存的機器。 – Nemo 2011-06-05 06:10:34