根据OpenAcc 2.6规范[1]第1357行和第1358行:
必须编写与没有seq子句的循环结构相关联的循环,以便在进入循环结构时可以计算循环迭代计数。
似乎是这种情况,因此您的代码是有效的。
但是,请注意,实现定义了如何在帮派和工作人员之间分配工作,并且可能PGI编译器只是对迭代进行一些简单的分区。 您可以使用num_gangs和num_workers手动定义gang / workers的值,传递给这些子句的整数表达式可以取决于函数的值(参见OpenACC规范的2.5.7和2.5.8)。
[1] https://www.openacc.org/sites/default/files/inline-files/OpenACC.2.6.final.pdf
PGI编译器将选择如何在编译时分解工作,但通常会确定运行时的帮派数量。帮派本质上是可扩展的并行性,因此可以推迟到运行时间的数量。向量长度和工作者数量会影响底层内核的生成方式,因此通常在编译时选择它们以最大化优化机会。对于这样的循环,在编译时并不真正知道边界,编译器必须在内核中生成一些额外的代码,以确保执行正确的迭代次数。