【发布时间】:2014-02-05 06:00:56
【问题描述】:
这是我关于 openacc 的问题。 我阅读了 API(v1 和 v2),但我不清楚具有同一数组的不同子部分的嵌套数据环境的行为。
代码示例:
#pragma acc data pcopyin(a[0:20])
{
#pragma acc data pcopyin(a[100:20])
{
#pragma acc parallel loop
for(i=0; i<20; i++)
a[i] = i;
a[i+100] = i;
}
}
我的理解是这应该可以工作(或至少两个 acc 数据部分):
- 第一个编译指示检查 a[0,20] 是否在加速器上
- 否 -> 数据在设备上分配并传输
- 第二个编译指示检查 a[100,120] 是否在加速器上
- 指针 a 在加速器上,但不是来自 a[100,120] 的数据
- 数据在设备上分配和传输
我用 CAPS 编译器(v3.3.0,这是我的测试机器上目前唯一可用的)尝试了这种事情,第二个 pragma acc 数据返回一个错误(我的第二个子数组没有正确的形状)。 所以我的测试(我想)发生的事情是在加速器上找到了指针“a”,但与它相关的形状([0:20])在我的第二个编译指示([100:20] )。
这是 API 中计划的正常行为,还是我的示例应该有效?
此外,如果这应该起作用,同一数组的子部分之间是否存在某种连贯性(不知何故,它们将像在主机上一样定位,我将能够放置 a[i] += a [100+i] 在我的内核中)?
【问题讨论】:
标签: openacc