OpenACC のネストされた機能を使用して、GPU カードの動的並列処理をアクティブにしようとしています。私は Tesla 40c を使用しており、OpenACC コンパイラは PGI バージョン 15.7 です。
私のコードはとてもシンプルです。次のコードをコンパイルしようとすると、コンパイラからこれらのメッセージが返されます
PGCC-S-0155-Illegal context for pragma: acc parallel loop (test.cpp: 158)
PGCC/x86 Linux 15.7-0: compilation completed with severe errors
私のコード構造:
#pragma acc parallel loop
for( i = 0; i < N; i++ )
{
// << computation >>
int ss = A[tid].start;
int ee = A[tid].end;
#pragma acc parallel loop
for(j = ss; j< ( ee + ss); j++)
{
// << computation >>
}
また、ルーチン ディレクティブを使用するようにコードを変更しようとしました。しかし、私は再びコンパイルできませんでした
#pragma acc routine workers
foo(...)
{
#pragma acc parallel loop
for(j = ss; j< ( ee + ss); j++)
{
// << computation >>
}
}
#pragma acc parallel loop
for( i = 0; i < N; i++ )
{
// << computation >>
int ss = A[tid].start;
int ee = A[tid].end;
foo(...);
}
もちろん、内部の並列ループディレクティブを使用せずにルーチン (seq、worker、gang) でのみ試しました。コンパイラはされていますが、動的並列処理は有効化されていません。
37, Generating acc routine worker
Generating Tesla code
42, #pragma acc loop vector, worker /* threadIdx.x threadIdx.y */
Loop is parallelizable
OpenACC で動的並列処理を使用するにはどうすればよいですか?