2010-11-22 24 views
6

私は現在、(C言語で)外部ループがOpenMP並列化されたコードを共有メモリリスト上でローカルに実行しています。私はC++でそれを書き直しています。多くの事のために、BOOST_FOREACHマクロはリストや配列などを繰り返し処理するためのループ構文として非常に便利です。FOREACHマクロとOpenMPの並列化を混ぜる

私の両方の使い方はありますか?その構文とループOpenMP形式の並列化?

答えて

2

コピーが1キロワード価値がある:

$ g++ a.cpp -I/opt/boost-1.45.0/include -O -fopenmp 
a.cpp: In function ‘int main()’: 
a.cpp:12: error: for statement expected before ‘if’ 
0

はい、うまくいくはずです。 BOOST_FOREACHはforループのヘルパーマクロなので、OpenMPはそのループを認識して並列化する必要があります。

+1

私は正確にはわからない...私の知る限り、ヘッダーから見ることができるように、BOOST_FOREACHマクロは、forループ以上に拡大し、理由最初に一連の 'if'-' else'が含まれています...したがって、OpenMPディレクティブをマクロのすぐ上に置くと、 'for'ループ自体の直上にはなりません。 –

0

なぜ簡単に試してみて、結果をプロファイルしてみませんか?

OpenMPがboost_foreachをparalizedすると感心します。foreachは、コンテナの種類を差し引くテンプレートトリックに大きく依存しています。私があなたの立場にいるなら、定期的なfor-loopsを使うforeachのものを書き直します。端末から

+2

地獄、その答えに間違ったことがたくさんある...コンピュータ科学は経験的な科学ではない。要するに、特定のコンパイラ(とオプションのセット)を使用して、指定されたシステムで動作する場合、他のシステムや他のコンパイラでも動作するという保証はありません。 –

+0

科学と科学、もしNUM_CORES-3倍速ければ、私はまだopenMP paralizes forループ –

関連する問題