2016-05-05 27 views
1

OpenMPを使用してコードを並列化しています。私はループを2つのイテレータで並列化しようとします。イテレータopenMPのループ

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

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    vector<float> v = {1, 2, 3, 4}; 
    vector<float> d = {0, 0, 0, 0}; 
    vector<float>::iterator iterV, iterD; 

    for(iterV = v.begin(), iterD = d.begin(); iterV < v.end(); ++iterV, ++iterD) 
    { 
     *iterD = *iterV; 
    } 


    for(iterD = d.begin(); iterD < d.end(); ++iterD) 
    cout << *iterD << endl; 

    return 0; 
} 

このコードの私の並列バージョン:

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

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    vector<float> v = {1, 2, 3, 4}; 
    vector<float> d = {0, 0, 0, 0}; 
    vector<float>::iterator iterV, iterD; 

    iterV = v.begin(); 
    iterD = d.begin(); 

#pragma omp parallel for 
    for(int i = 0; i < v.size(); ++i) 
    { 
     *(iterD + i) = *(iterV + i) ; 
    } 


    for(iterD = d.begin(); iterD < d.end(); ++iterD) 
    cout << *iterD << endl; 

    return 0; 
}` 
+3

_ "私のコードを麻痺させる" _ああ、いけません。それに値するコードはありません。あなたはおそらくそれを並列化しようとしました。 –

+0

通常、並列化はパフォーマンス向上のためだけではありません。残念ながら、貴重なパフォーマンス最適化のアドバイスを与えるためにあなたの例はあまりにも合成されています。私はシリアルバージョンで 'std :: copy. 'を使うべきだと言うことができます。 – Zulan

+0

私は私のニーズをよく理解するために例を合成します。私はちょうどopenMPで並列化する最良の方法を2つのイテレータでループしているかどうかを知りたいと思います。 – axel

答えて

0

あなたの例では、ほとんどすべてのパフォーマンスの最適化を必要としないこれは非常に簡単です、私は私の実装では、この順次コードを並列化するための最良の方法であるかどうかを知りたいです。メモリをコピーするだけです(代わりにstd::copyを使用して最適化できます)。

あなたが書いたコードは正しいものであり、パフォーマンスを得るために他の方法で書くことはほとんどありません。しかし、より洗練されたコードを維持するために、私はループイテレータを各スレッド専用に維持しようとします。これにより、コードはきれいになります(個人的な好み)。

vector<float> v = {1, 2, 3, 4}; 
    vector<float> d = {0, 0, 0, 0}; 
    #pragma omp parallel for 
    for(auto it_v = v.begin(),it_d = d.begin(); it_v!=v.end();++it_v,++it_d) 
    { 
     *it_d = *it_v; 
    } 

EDIT

のOpenMP 3.1は、この場合に、複数のループ初期化を許可しません。彼らの仕様には準拠していません。ですから、1つの方法は次のとおりです。

#pragma omp parallel 
    { 
    auto it_v = v.begin(),it_d = d.begin(); 
    #pragma openmp for 
    for(; it_v!=v.end();++it_v) 
    { 
     *it_d = *it_v; 
    } 
    } 
+0

ありがとう!しかし、あなたの解決策を試してみましたが、私はこのエラーを受け取りました: 'expected ';' before '、'トークン for(auto itV = v.begin()、itD = d.begin(); itV!= v.end(); ++ itV、++ itD) ' 使用しているOpenMPのバージョンは? – axel

+0

-std = C++ 11フラグを使用しましたか? 'auto'はC++のキーワードです –

+0

はい-stdd = C++ 11フラグ – axel

関連する問題