我正在嘗試使用我正在使用的程序並得到以下問題。 如果多個線程需要在同一個矢量上讀取/寫入,但是矢量的不同元素會損失性能嗎?我感覺這就是我的程序在對其進行平滑處理時幾乎沒有得到更快的原因。看看下面的代碼:OpenMP中的共享向量
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
double x;
//write 10 values in vector numbers
for (int i =0; i<10; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for \
private(x) \
shared(numbers, results)
for(int j = 0; j < 10; j++){
x = 2 * numbers[j] + 5;
#pragma omp critical // do I need this ?
{
results[j] = x;
}
}
return 0;
}
顯然,實際的程序確實更加昂貴的操作,但這個例子應 只能說明我的問題。那麼for循環可以快速完成並行,或者不同的線程必須等待對方,因爲一次只有一個線程可以訪問向量編號,儘管它們都讀取了向量的不同元素?
與寫操作相同的問題:我需要的關鍵編譯或因爲每個線程寫入矢量結果的不同元素是沒有問題? 我很高興能得到每一個幫助,也很高興知道是否有更好的方法來做到這一點(也許根本不使用向量,但簡單的數組和指針等?) 我也讀向量aren 「T在某些情況下是線程安全的,建議使用指針:OpenMP and STL vector
非常感謝您的幫助!
他不調整向量的。 – eudoxos 2012-03-31 09:22:39
@eudoxos我意識到,從代碼片段,我只是想確保有人提到,特別是因爲他提出了一個事實,即STL矢量某些條件下不會 – SirGuy 2012-03-31 12:43:23
+1線程安全:它不會真的拿出在這裏,但你必須記住特定向量的操作,如追加,調整大小等不是線程安全的,並可能會中斷。但只要每個元素只由一個線程寫入,只需操作矢量的元素就沒有問題。 – 2012-03-31 15:35:14