質問は、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 関数の呼び出しに遭遇するとどうなりますか?