2012-04-01 11 views
1

私の前の質問 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-**]; 

答えて

2

読取素子を共有するために多くの仕事がないこと複数のスレッドからのベクトルは問題ではありません。あなたのコードには同期がないので、同時にアクセスされます。

ベクトルのサイズが大きければ、キャッシュの問題もありませんが、ベクトルが大きければキャッシュアクセスパターンによって速度が低下することがあります。その場合、数字データのコピーを別にすると、パフォーマンスが向上します。

+0

お返事ありがとうございます。実際に私が実際に使用したいベクトルには、67 * 10^6エントリ(double型またはfloat型)があります。だから私はコピーを作り、どうすればいいのですか? 「あなたのコードに同期がありません」とどういう意味ですか? – user1304680

+0

@ user1304680のように、あなたはマルチプレイヤーに慣れていないようですので、より多くの背景情報を読むことをお勧めします。簡単に言えば、同期はリソースへのアクセスを制限して、複数のスレッドがそれを読み込んで変更できるようにする方法です。これは論理的な正しさを保証する方法ですが、並列性はなくなります。同期化は、アトミック操作、クリティカルセクション、mutexを通じて行われます。 –

+0

@ user1304680、私はまず、パフォーマンスのスケーリングを開始し、検証するためのコピーをしないことをお勧めします。パフォーマンスがコアの数に比例しない場合は、キャッシュアクセスの最適化を検討することができます。 –

1

より良いアプローチ:それはちょっとによる事実に遅くなります

#include <vector> 

int main(){ 

vector<double> numbers; 
vector<double> results(10); 

//write 25 values in vector numbers 
for (int i =0; i<25; i++){ 
    numbers.push_back(cos(i)); 
} 

#pragma omp parallel for 
    for (int j = 0; j < 10; j++){ 
     double x = 0; // make x local var 
     for(int k = 0; k < 25; k++){ 
      x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k/25]; 
     } 
     results[j] = x; // no race here  
    } 

    return 0; 

} 

同じの

+0

ありがとうございます。私はあなたがループ内でxを宣言する方法を見ることができます。これはすでにhttp://stackoverflow.com/questions/9953905/shared-vectors-in-openmpで議論されていますが、それ以外の場合はベクトル結果と'numbers'は暗黙的に共有されています。共有する作業はあまりないかもしれませんが、私の質問は、異なるスレッドがベクトル '数字'の同じ要素を読み込むため、一般に並列化が遅くなる場合です。 – user1304680

+0

の読み込みはパフォーマンス上の問題ではない可能性がありますが、書き込みはfalse sharing(google)の可能性があります。あなたは外側のループをチャンクすることによってそれを解決することができます。 – Anycorn

関連する問題