首页 > 解决方案 > OpenACC 调度

问题描述

假设我有这样的构造:

for(int i=0;i<5000;i++){
  const int upper_bound = f(i);
  #pragma acc parallel loop
  for(int j=0;j<upper_bound;j++){
    //Do work...
  }
}

其中f是 的单调递减函数i

由于num_gangsnum_workersvector_length没有设置,OpenACC 选择它认为合适的调度。

但是它是每次遇到pragma都重新选择这样的调度,还是第一次遇到pragma时才选择一次呢?

查看的输出PGI_ACC_TIME表明调度只执行一次。

标签: openaccpgi

解决方案


PGI 编译器将在编译时选择如何分解工作,但通常会在运行时确定帮派的数量。Gangs 本质上是可扩展的并行性,因此可以推迟到运行时决定有多少。向量长度和worker的数量会影响底层内核的生成方式,因此通常在编译时选择它们以最大化优化机会。对于像这样的循环,在编译时并不知道边界,编译器必须在内核中生成一些额外的代码,以确保执行正确的迭代次数。


推荐阅读