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])
}
我正在尝试为 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])
}