2013-06-21 12 views
11

ClangはOpenMPをサポートしていませんが、C++ 11で "parallel for"を実装することは可能ですか?clangでOpenMPを代替するC++ 11

+3

これはcodereview.stackexchange.comに適しています。移行する投票。 –

+1

Clangのopenmpサポートが見直されています。現在、バージョン3.1がサポートされており、バージョン4.0が開発中です。 – xryl669

+2

clang 3.4 plus OpenMPは、http://clang-omp.github.io/ – mabraham

答えて

7

OpenMPのバージョン:

// parallelfor_gcc.cpp 
// g++ -O2 -Wall -std=c++11 -fopenmp parallelfor_gcc.cpp 
#include <cmath> 
#include <vector> 
int main() { 
    unsigned int size = 1e8; 
    std::vector<double> vect(size); 
#pragma omp parallel for 
    for (unsigned int i=0; i<size; i++) { 
    vect[i] = sin(2*M_PI*i/(double)size); 
    } 
    return 0; 
} 

C++ 11バージョン:

// parallelfor_clang.cpp 
// clang++ -O4 -Wall -std=c++11 -lpthread parallelfor_clang.cpp 
#include <cmath> 
#include <thread> 
#include <vector> 
void parallelFor(const unsigned int size, 
       std::function<void(const unsigned int)> func) { 
    const unsigned int nbThreads = std::thread::hardware_concurrency(); 
    std::vector <std::thread> threads; 
    for (unsigned int idThread = 0; idThread < nbThreads; idThread++) { 
    auto threadFunc = [=, &threads]() { 
     for (unsigned int i=idThread; i<size; i+=nbThreads) { 
     func(i); 
     } 
    }; 
    threads.push_back(std::thread(threadFunc)); 
    } 
    for (auto & t : threads) t.join(); 
} 
int main() { 
    unsigned int size = 1e8; 
    std::vector<double> vect(size); 
    auto myFunc = [=, &vect](unsigned int i){ 
    vect[i] = sin(2*M_PI*i/(double)size); 
    }; 
    parallelFor(size, myFunc); 
    return 0; 
} 

OpenMPの句(FIRSTPRIVATEが...)と同じ方法で実施することができるが、それは(少し)より多くの仕事です...

+2

から入手できます。これはC++ 11で実行できる良い例ですが、複数の欠点があります。 OpenMPでは、例のように、計算の直後にスレッドが結合されません。より詳細な例では、C++ 11のバージョンでは、異なるスレッドを処理するために "スレッド"ベクタを修正しないと、コードを読みにくくしない限り、大きなオーバーヘッドが追加されます。 – xryl669

+0

@ xryl669私はその仕事のためにこのライブラリをお勧めします。コードは読みやすく、使いやすいです。 https://code.google.com/p/threadpool11/ – Etherealone

+0

ラムダが 'threads'ベクターをキャプチャしているように見えますが、それはなぜですか? – remram

関連する問題