【发布时间】:2016-02-14 12:17:19
【问题描述】:
我正在 Cuda 中实现 device_vector,我正在从著名的库 Thust 中获取想法。
现在要访问和修改 device_vector (v) 中的元素,我需要执行 v[N] = x。为此,我需要重载 [] 运算符。
这是用于重载 [] 运算符的代码:
T& operator[] (unsigned int index)
{
if (index >= numEle)
return ptr[0];
else
return ptr[index];
}
问题是:要修改设备内存中的任何内存位置,我们需要进行 Cuda 内核调用,而 Cuda 内核调用无法返回任何内容。
就 [] 重载而言,它返回对我们要修改的元素的引用。
我们如何为 Cuda 内核做到这一点?
注意:我知道 Thrust Library 会以某种方式做到这一点,但我无法理解。
【问题讨论】:
-
您可以返回一个临时对象,允许从
unsigned int转换和赋值。 -
@Kos 我听不懂...你能不能给我更多的细节。
-
这个函数应该运行在主机还是设备上?
-
将从主机使用运算符。但是要修改设备中的内存,我们需要进行内核调用。
-
这不是启动的内核名称。我并不认为推力可能会使用内核启动来完成各种事情,但在您的测试用例中,
nvprof输出中的内核启动行 precedes[CUDA memcpy DtoH]行。您正在见证的内核启动发生在thrust::device_vector的实例化时。[CUDA memcpy DtoH]是 nvprof 报告发生cudaMemcpy操作(不是内核启动)的方式,并且该操作的指定方向是cudaMemcpyDeviceToHost(这是由于您的v[N]“取消引用”而发生的)。