私の前の質問 Shared vectors in OpenMP 異なるスレッドが の異なるスレッドがベクトルの異なる要素にアクセスする限り、共有ベクトルで異なるスレッドを読み書きできるようにすることができました。 異なるスレッドが、次のようなベクトルのすべての(たまに同じである)要素を読み取る必要がある場合はどうなりますか?一度に一つのスレッドがベクトルの任意の要素を読むことができるか、そうでないのでOpenMP 2の共有ベクトル
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
double x;
//write 25 values in vector numbers
for (int i =0; i<25; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for default(none) \
shared(numbers, results) \
private(x)
for (int j = 0; j < 10; j++){
for(int k = 0; k < 25; k++){
x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k/25];
}
results[j] = x;
}
return 0;
}
この並列化は遅いでしょうか?私はこの問題をfirstprivate(numbers)
という節で解決できますか?
すべてのスレッドが独自のベクトルを得るようにベクトルの配列を作成することは意味がありますか?例えば
:
vector<double> numbersx[**-number of threads-**];
お返事ありがとうございます。実際に私が実際に使用したいベクトルには、67 * 10^6エントリ(double型またはfloat型)があります。だから私はコピーを作り、どうすればいいのですか? 「あなたのコードに同期がありません」とどういう意味ですか? – user1304680
@ user1304680のように、あなたはマルチプレイヤーに慣れていないようですので、より多くの背景情報を読むことをお勧めします。簡単に言えば、同期はリソースへのアクセスを制限して、複数のスレッドがそれを読み込んで変更できるようにする方法です。これは論理的な正しさを保証する方法ですが、並列性はなくなります。同期化は、アトミック操作、クリティカルセクション、mutexを通じて行われます。 –
@ user1304680、私はまず、パフォーマンスのスケーリングを開始し、検証するためのコピーをしないことをお勧めします。パフォーマンスがコアの数に比例しない場合は、キャッシュアクセスの最適化を検討することができます。 –