将 copy_if 设备推向主机

thrust copy_if device to host

我在尝试执行以下操作时在 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 设备-> 主机复制操作。因此,thrust 可以在 CUDA 后端完成此操作的唯一方法是在设备上创建一个中间数组来执行压缩操作,然后是 cudaMemcpy 来影响设备->主机传输(它不会按照你发现的去做)。所以没有任何办法绕过临时数组,即使 thrust 会为你做 "automatically"(它不会)。

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