我正在尝试使用 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 中使用动态并行性?