2017-02-06 3 views
0

変数の値をルックアップするのと比較して、omp_get_thread_num()を呼び出す際のパフォーマンスコストはいくらですか?simdでループのためにomp_get_thread_num()を並列に呼び出さないでください

simd openmpループで何度もomp_get_thread_num()を呼び出すことを回避するにはどうすればよいですか?

私は#pragma omp parallelを使うことができますが、それはsimdループを作るでしょうか?

#include <vector> 
#include <omp.h> 
int main() { 
    std::vector<int> a(100); 
    auto a_size = a.size(); 
    #pragma omp for simd 
    for (int i = 0; i < a_size; ++i) { 
     a[i] = omp_get_thread_num(); 
    } 
} 
+0

実際のコードでは、自動ベクトル化が役立つはずの部分は、ドメイン分解のためにopenmpのスレッドIDを使用します。 –

答えて

3

私は、コールのコストについてあまり心配ではありませんが、コードをわかりやすくするためにあなたが行うことができます。

#include <vector> 
#include <omp.h> 

int main() { 
    std::vector<int> a(100); 
    auto a_size = a.size(); 
    #pragma omp parallel 
    { 
     const auto threadId = omp_get_thread_num(); 

     #pragma omp for 
     for (int i = 0; i < a_size; ++i) { 
      a[i] = threadId; 
     } 
    } 
} 

限り、あなたは#pragma omp forを使用して(と余分に入れていないよう`parallel in there!そうでなければ、あなたのn個のスレッドはそれぞれn個のスレッドを生成します...それは悪いです)、並列領域内でforループがn個のスレッドに分割されます。 ompコンパイラフラグがオンになっていることを確認してください。

+0

ありがとうございます。私は実際のコードで '#pragma omp for simd'を使用しています。なぜなら、' #pragma'で '' simd'なしで自動ベクトル化が起こらないと心配しているからです。 omp_get_thread_num()は変数のルックアップよりも遅いですか? (おそらく、libompは共有ライブラリなので、そのようなケースでしょう。) –

関連する問題