thrust::device_vector.pushback() 会调用 memcpy 吗?
does thrust::device_vector.pushback() cause a call to memcpy?
总结
我想澄清一下 thrust::device_vector 的工作原理。
AFAIK,写入索引位置(例如 device_vector[i] = 7)是由主机实现的,因此会调用 memcpy。 device_vector.push_back(7)也调用memcpy吗?
背景
我正在做一个比较股票价格的项目。价格存储在两个向量中。我遍历这两个向量,当它们的价格相对于彼此发生变化时,我将该变化写入一个新向量。所以我永远不知道生成的向量会有多长。在 CPU 上,执行此操作的自然方法是使用 push_back,但我不想在 GPU 向量上使用 push_back,如果它每次都会调用 memcpy。
有没有更有效的方法在 GPU 上逐个构建向量?
研究
我看过 this 问题,但它(和其他人)关注的是从主机访问元素的最有效方式。我想在 GPU 上建立一个向量。
谢谢。
Does device_vector.push_back(7) also call memcpy?
没有。但是,它确实会在每次调用时启动内核。
Is there a more efficient way to build a vector piece by piece on the GPU?
是的。
首先在主机内存中构建它(或它的大部分),然后通过一次操作将其复制或插入到设备上的内存中。通过这样做,您将大大减少延迟并提高 PCI-e 总线利用率。
总结
我想澄清一下 thrust::device_vector 的工作原理。
AFAIK,写入索引位置(例如 device_vector[i] = 7)是由主机实现的,因此会调用 memcpy。 device_vector.push_back(7)也调用memcpy吗?
背景
我正在做一个比较股票价格的项目。价格存储在两个向量中。我遍历这两个向量,当它们的价格相对于彼此发生变化时,我将该变化写入一个新向量。所以我永远不知道生成的向量会有多长。在 CPU 上,执行此操作的自然方法是使用 push_back,但我不想在 GPU 向量上使用 push_back,如果它每次都会调用 memcpy。
有没有更有效的方法在 GPU 上逐个构建向量?
研究
我看过 this 问题,但它(和其他人)关注的是从主机访问元素的最有效方式。我想在 GPU 上建立一个向量。
谢谢。
Does device_vector.push_back(7) also call memcpy?
没有。但是,它确实会在每次调用时启动内核。
Is there a more efficient way to build a vector piece by piece on the GPU?
是的。
首先在主机内存中构建它(或它的大部分),然后通过一次操作将其复制或插入到设备上的内存中。通过这样做,您将大大减少延迟并提高 PCI-e 总线利用率。