サードパーティによって書かれた大きなプログラムを並列化しようとしています。コードを公開することはできませんが、私がやりたいことの最も近い例を試してみます。 以下のコードに基づいています。ご覧のように、 "parallel"という節はwhileループの中にあるので、スレッドの作成/破壊はそれぞれの反復で行われますが、これはコストがかかります。 私はInitializors ...などを "while"ループの外に移動することはできません。プログラムを実行するたびにスレッドを作成するようにOpenMPに要求するにはどうすればよいですか?
--Baseコード
void funcPiece0()
{
// many lines and branches of code
}
void funcPiece1()
{
// also many lines and branches of code
}
void funcCore()
{
funcInitThis();
funcInitThat();
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
{
funcPiece0();
}//omp section
#pragma omp section
{
funcPiece1();
}//omp section
}//omp sections
}//omp parallel
}
int main()
{
funcInitThis();
funcInitThat();
#pragma omp parallel
{
while(1)
{
funcCore();
}
}
}
私は何をしようとすると、単位の反復作成/破壊を回避し、プログラムの開始/終了時に一度、それを作ることです。私は "平行"句の移動に多くのバリエーションを試しました。私は基本的に同じエッセンスを持っています:(1つのスレッド作成/破壊プログラムごとの実行) - 私は試してみましたが、初期化関数で "不正なアクセス"に失敗しました。
void funcPiece0()
{
// many lines and branches of code
}
void funcPiece1()
{
// also many lines and branches of code
}
void funcCore()
{
funcInitThis();
funcInitThat();
//#pragma omp parallel
// {
#pragma omp sections
{
#pragma omp section
{
funcPiece0();
}//omp section
#pragma omp section
{
funcPiece1();
}//omp section
}//omp sections
// }//omp parallel
}
int main()
{
funcInitThis();
funcInitThat();
while(1)
{
funcCore();
}
}
-
すべてのヘルプは非常にいただければ幸いです! ありがとう!
OpenMPのWebサイトには、OpenMPに関する質問を投稿できるフォーラムがあります。http://openmp.org/forum/ –