OpenACC:即使已经存在,如何强制将数据从主机复制到设备?

OpenACC: How to force copy data from host to device even if already present?

我正在尝试为 OpenACC 代码构建一些时间指标。最耗时的任务之一是将大型阵列从主机复制到设备。我 运行 多次使用相同的代码,以便取平均值并获得更准确的值。但是,我运行遇到这个大数组只复制一次的问题,因此在所有后续的运行代码中,都没有考虑复制时间。

我一定是遗漏了一些东西,但我认为当我们使用 'structured data directives' 时,内存只存在于数据区域内。但是,从我的时间测量来看,情况似乎并非如此。非常感谢对这里实际发生的事情有更多了解。

代码如下所示:(data 是我想在每次 运行 时显式复制到设备中的大数组)

#pragma acc data copyin(data[0:N*4]) create(grid[0:n*n], cell_ij) copyout(grid[0:n*n])
{
    // ...
}

我正在编译:

pgc++ -lstdc++ -O2 -Wall -std=c++11 -acc -ta=nvidia -Minfo=accel

编译器告诉我:

Generating copyin(data[:262144]) [if not already present]

如何删除 [if not already present]?还是喜欢复制它?

假设这些变量不在另一个数据区域中,它们不会存在,因此会被复制。但是如果你想确定,你可以在数据区域使用“创建”,然后使用“更新”指令显式复制数组。

#pragma acc data create(data[0:N*4], grid[0:n*n], cell_ij)
{
  #pragma acc update device(data[0:N*4]) 
    // ...
  #pragma acc update self(grid[0:n*n])
}