c++ - 将 copy_if 设备推送到主机

标签 c++ cuda thrust

尝试执行以下操作时,我在 thrust 模板的实例化中收到编译时错误:

thrust::copy_if(deviceEntries.begin(), deviceEntries.end(), hostResultBuffer->begin(),
                                                      IsEntrySelected(rootLayer));

IsEntrySelected 的定义:

struct IsEntrySelected : thrust::unary_function<Entry, bool> {
        inline IsEntrySelected(const unsigned long int layer):_layer(layer) {}

        __device__ __host__
        inline bool operator()(const Entry & val) const {
            return val.selected && val.layer == _layer;
        }

    private:
        unsigned long int _layer;
    };

这个操作可行吗?我已经能够通过将结果放在 GPU 上的中间 device_vector 缓冲区而不是直接复制到主机缓冲区来使用相同的调用,但我想避免这样做以节省 GPU 内存。是否有另一种方法可以避免额外的 GPU 缓冲区,有条件地过滤和复制到主机?

最佳答案

Is this operation possible?

不,不可能以这种方式使用copy_if

没有 CUDA 设备-> 主机复制操作可以将任意分散的数组复制到压缩数组。因此,推力可以在 CUDA 后端完成此操作的唯一方法是在设备上创建一个中间数组来执行压缩操作,然后是 cudaMemcpy 来实现设备->主机传输(它不像你发现的那样做)。因此,没有任何办法绕过临时数组,即使 thrust 会“自动”为您完成(它不会)。

如果空间非常宝贵,则将数组原封不动地复制到主机并在那里进行流压缩。但出于性能原因,我希望在设备上进行流压缩,然后将(可能更小的)数组传输到主机通常会更好。

关于c++ - 将 copy_if 设备推送到主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36877029/

相关文章:

c++ - 明确的特化; 'std::hash<_Kty>' 已经实例化

c++ - 如何在 Visual Studio 2013 中启用 CUDA 7.0+ 每线程默认流?

c++ - CUDA 真的没有类似 calloc() 的 API 调用吗?

c++ - 将 CUDA 分配 char * 到对象的 device_vector

cuda - 推力不调用设备功能

c++ - union 而不是 aligned_storage_t 作为容器节点类型的一部分

c++ - 友元和运营商=重载

docker - 将 nvidia 运行时添加到 docker 运行时

cuda:cpu和gpu之间的不同答案减少

c++ - 在 Arduino 中使用虚拟方法