【发布时间】:2017-10-05 05:19:28
【问题描述】:
如果我有两个 cudaMalloced 数组,我可以通过简单地交换相关指针来交换它们而无需内存移动。
如果我有两个 CUDA Thrust device_vector,比如 d_a 和 d_b,我可以使用第三个临时向量来交换它们,比如 d_c,但这需要内存移动。
我的问题是:有没有办法在不移动内存的情况下交换 CUDA Thrust device_vectors?
【问题讨论】:
-
thrust::vector类有一个contiguous_storage类型的成员,用于存储向量内容。在内部交换向量时,仅交换contiguous_storage的begin()迭代器、size和allocator。因此不涉及数据的内存副本。您可以在文件contiguous_storage.inl内的swap成员函数中检查这一点。 -
在赋值运算符的情况下,如果你看
vector_base::operator=的代码,它使用了assign函数,它似乎执行了向量内容的完整内存复制。 -
@sgarizvi 感谢您的 cmets。实际上,这与@talonmies 在下面的 cmets 中指出的反对意见相同。然而,奇怪的是我在时间轴中找不到内存副本。也许
thrust使用内核来执行复制? -
@sgarizvi 我已经在我的主代码中用
swap替换了显式副本,这对时间有好处。至少,swap似乎比复制快。 -
我认为这是向量类相对较新的特性。在过去,我很确定交换使用复制分配并触发内存复制。