openacc - 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_gangs
、num_workers
和vector_length
没有设置,OpenACC 选择它认为合适的调度。
但是它是每次遇到pragma都重新选择这样的调度,还是第一次遇到pragma时才选择一次呢?
查看的输出PGI_ACC_TIME
表明调度只执行一次。
解决方案
PGI 编译器将在编译时选择如何分解工作,但通常会在运行时确定帮派的数量。Gangs 本质上是可扩展的并行性,因此可以推迟到运行时决定有多少。向量长度和worker的数量会影响底层内核的生成方式,因此通常在编译时选择它们以最大化优化机会。对于像这样的循环,在编译时并不知道边界,编译器必须在内核中生成一些额外的代码,以确保执行正确的迭代次数。
推荐阅读
- javascript - Jest --watchAll 不监视 Docker 中的文件更改
- mongodb - MongoDB 的自定义记录器
- postgresql - Hasura 为某些条目返回重复项
- validation - p:selectOneRadio with required="true",如果提交未选中,不会将其 p:selectOneRadio 变为红色
- lucene - 在 Nexus 2 中搜索会产生意想不到的结果
- php - 如何从子主题运行特定页面的脚本?
- tensorflow - 使用 tensorflow.data.TextLineDataset 解析和过滤读取文本文件
- javascript - React - 单击按钮并删除列表元素
- javascript - 提取姓氏但不按字母顺序排序
- sorting - 按名称和年龄降序按列表排序