![]() |
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 |
![]() |
kaytu · push_back()后向量大小发生变化 2 年前 |
![]() |
Megasa3 · 使用随机值初始化二维向量 7 年前 |
![]() |
enanone · 求反std::矢量的最快方法 7 年前 |
![]() |
Victor O. · 如何将向量列表存储为全局变量? 7 年前 |
![]() |
PaperMoon · 具有结构mmapped向量的结构 7 年前 |