我建议您参考以下页面http://code.google.com/p/thrust/wiki/QuickStartGuide#Vectors。请看第二段,它说
另请注意,可以使用标准括号表示法访问 device_vector 的各个元素。但是,因为这些访问中的每一个都需要调用 cudaMemcpy,所以应该谨慎使用它们。稍后我们将介绍一些更有效的技术。
我搜索了整个文档,但找不到更有效的技术。有谁知道最快的方法来做到这一点?即如何最快地访问主机上的设备向量/设备指针?
我建议您参考以下页面http://code.google.com/p/thrust/wiki/QuickStartGuide#Vectors。请看第二段,它说
另请注意,可以使用标准括号表示法访问 device_vector 的各个元素。但是,因为这些访问中的每一个都需要调用 cudaMemcpy,所以应该谨慎使用它们。稍后我们将介绍一些更有效的技术。
我搜索了整个文档,但找不到更有效的技术。有谁知道最快的方法来做到这一点?即如何最快地访问主机上的设备向量/设备指针?
该指南提到的“更有效的技术”是推力算法。一次访问(或通过 PCI-E 总线复制)数百万个元素比访问单个元素更有效,因为 CPU/GPU 通信的固定成本是摊销的。
没有比调用更快的方法将数据从 GPU 复制到 CPU cudaMemcpy
,因为它是 CUDA 程序员实现任务的最原始方式。
如果您有一个需要进行更多处理的 device_vector,请尝试将数据保留在设备上并使用 Thrust 算法或您自己的内核对其进行处理。如果您只需要从 device_vector 中读取几个值,只需使用括号表示法直接访问这些值。如果您需要访问多个值,请将 device_vector 复制到 host_vector 并从那里读取值。
thrust::device_vector<int> D;
...
thrust::host_vector<int> H = D;