ClangはOpenMPをサポートしていませんが、C++ 11で "parallel for"を実装することは可能ですか?clangでOpenMPを代替するC++ 11
答えて
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が...)と同じ方法で実施することができるが、それは(少し)より多くの仕事です...
から入手できます。これはC++ 11で実行できる良い例ですが、複数の欠点があります。 OpenMPでは、例のように、計算の直後にスレッドが結合されません。より詳細な例では、C++ 11のバージョンでは、異なるスレッドを処理するために "スレッド"ベクタを修正しないと、コードを読みにくくしない限り、大きなオーバーヘッドが追加されます。 – xryl669
@ xryl669私はその仕事のためにこのライブラリをお勧めします。コードは読みやすく、使いやすいです。 https://code.google.com/p/threadpool11/ – Etherealone
ラムダが 'threads'ベクターをキャプチャしているように見えますが、それはなぜですか? – remram
- 1. clang、openMP、CMake
- 2. clang ++ C++ 11呼び出し
- 3. OpenMPでLLVM/Clangをビルド中にOpenMPとC++に関連するエラー
- 4. Clang/LLVMにC++ 11ヘッダーを含める
- 5. OSXのライオンでclang 3.2でC++ 11をコンパイルするには?
- 6. clang-clを使用してopenmpでCコードをコンパイル
- 7. C++でOpenMPを使用する11範囲ベースのforループ?
- 8. Clang 3.1とC++ 11のサポート状況
- 9. cmakeにclangを使用させるC++ 11(C++ 14)
- 10. スコープ付き列挙型のベスト代替 - Pre C++ 11
- 11. Mac OS X(sierra)でclangでOpenMPサポートを有効にする
- 12. iOS 11で代替アプリアイコンを設定できません
- 13. C++でのオブジェクトリテラル代替
- 14. compute_face_descriptor()C++での代替
- 15. 代替WebBrowser .Net C#
- 16. 代替マージリンクリスト(Cコード)
- 17. C#Windowsサービス代替
- 18. ヘッドレスブラウザC#と代替
- 19. LLVM/Clangを使用したWin10でOpenMPを使用したCuda
- 20. C#protoactor - Akka.NETs pipetoの代替ですか?
- 21. Cローレベルプログラミングの代替品ですか?
- 22. typeid(T).name()の代わりにC++ 11?
- 23. は、代替offsetofは近代的なC++
- 24. C++:テンプレートに対する代替ソリューション
- 25. MSVCでOpenMPを使用してclangを取得する方法2015
- 26. Clang ++はMac端末でC++ 11を理解していません
- 27. C++ OpenMP Parallel For Loop - std :: vectorに代わるもの
- 28. JSONとC#System.Web.Script.Serialization.JavaScriptSerializerの代替
- 29. オプションタイプの代替案C#
- 30. C++ reverse_iterator代替方法
これはcodereview.stackexchange.comに適しています。移行する投票。 –
Clangのopenmpサポートが見直されています。現在、バージョン3.1がサポートされており、バージョン4.0が開発中です。 – xryl669
clang 3.4 plus OpenMPは、http://clang-omp.github.io/ – mabraham