1
0
openacc数据子句只执行对象的浅拷贝。由于“vector”是三个指针的集合,这意味着将vector放在copy in子句中只会复制指针,而不会复制它所指向的数据。 假设您使用的是pgi,那么最简单的事情就是使用cuda统一内存(即添加标记“-ta=tesla:managed”),并让cuda运行时为您管理数据移动。 否则,需要执行矢量的手动深度复制。这可能有点棘手,尤其是向量,所以让我知道,如果你需要一个例子。 |
2
0
同样,我强烈建议在设备上使用C++向量时使用CUDA统一内存(托管)。向量是具有三个私有指针的容器类型。如果openacc拷贝或更新执行浅层拷贝,则在将向量放入数据区域时,您将要复制指针,而不是它们指向的数据。更糟的是,由于指针是私有的,所以不能用设备指针更新它们。 相反,您需要创建一个临时指针数组来隐藏向量数组的数据,然后在设备上使用这个临时变量。大致如下:
使用托管内存时,地址位于主机和设备都可以访问的统一内存空间中。因此,当您访问“开始”和“结束”时,它们在设备上返回的地址是有效的。例如:
另一种选择是编写自己的向量类。我写了一个基本的例子作为第5章的一部分 Parallel Programming with OpenACC . 代码样本可以在 https://github.com/rmfarber/ParallelProgrammingWithOpenACC |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |