0

質問は、OpenMP のターゲット構造の宣言とGPU の動的/ネストされた並列処理機能に関連しています。OpenACC 2.0 は、2 つの方法で動的並列処理をサポートします。ルーチンディレクティブと並列/カーネル ディレクティブをネストされた方法で使用します。ただし、ターゲット、チーム、配布などのネストされたデバイス ディレクティブの使用は、OpenMP では禁止されています。しかし、ターゲット ディレクティブの宣言は、OpenACC のルーチン ディレクティブと似ているように思えます。

ただし、セマンティックとその使用法はまだ明確ではありません。私のサンプルコードはこんな感じです。

#pragma omp declare target
void foo(){

  //work-1

#pragma omp target teams distribute parallel for 
for(...)
{
    if(...){
       foo();
    {
      //work-2
    }
}

//work-3
}
#pragma omp end declare target

int main(){
//work 

foo();

}

その例では、関数 foo がデバイス関数としてマップされることを期待しています。しかし、内部にターゲット構造があるため、コンパイラはこのコードを何らかの方法で変換します。私の質問はここにあります。スレッドがターゲット コンストラクト内で foo 関数の呼び出しに遭遇するとどうなりますか?

4

1 に答える 1

1

現在、OpenMP はターゲット領域のネストをサポートしていません。したがって、コードはおそらくコンパイルされません。または、ネストされたターゲット コンストラクトが検出されたときに、実行時にクラッシュする可能性があります。または予期しない結果を生成します。基本的に不適合プログラムの結果は規定されていません。

于 2015-08-18T08:01:54.190 に答える