私は使用しているプログラムをparallizeしようとしていますが、次の質問があります。 複数のスレッドが同じベクトルでもベクトルの異なる要素を読み書きする必要がある場合、パフォーマンスが低下しますか?私の気持ちは、私のプログラムがそれを視覚化することでほとんど遅くならないという理由があります。次のコードを取る: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ループは高速かつ完全に並列処理できますか、あるいは、異なるスレッドはお互いに待ち合わせる必要がありますか?ベクトルの異なる要素をすべて読み込んでいますが、一度に1つのスレッドしかベクトル番号にアクセスできないためです。
書き込み操作で同じ質問:すべてのスレッドがベクトル結果の異なる要素に書き込むため、クリティカルなプラグマが必要ですか、問題ありませんか? 私は得ることができるあらゆる援助に満足していますし、これを行う良い方法があるかどうかを知ることも良いでしょう(ベクトルをまったく使用しないかもしれませんが、単純な配列やポインタなど?) 私はベクトルaren場合によってはスレッドセーフで、ポインタを使用することをお勧めします:OpenMP and STL vector
ありがとうございました!
彼はまったくベクトルのサイズを変更しません。 – eudoxos
@eudoxos私は、コードスニペットから、特定の条件の下でSTLベクトルがスレッドセーフではないという事実を提起して以来、それが言及されたことを確かめたいと思っていました。 – SirGuy
+1:ここでは、appending、resizingなどのベクトル固有の操作はスレッドセーフではなく、おそらく破損することに注意してください。しかし、各要素が1つのスレッドだけによって書き込まれている限り、ベクトルの要素に対して操作するだけで問題ありません。 –