将copy_if设备推送到主机

时间:2016-04-26 22:35:50

标签: c++ cuda 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缓冲的方式有条件地过滤和复制到主机的方法?

1 个答案:

答案 0 :(得分:1)

  

此操作可以吗?

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

没有CUDA设备 - &gt;主机复制操作可以将任意分散的阵列复制到压缩阵列。因此推力可以在CUDA后端实现这一目标的唯一方法是在设备上创建一个中间阵列来进行压缩操作,然后使用cudaMemcpy来实现设备 - >主机传输(它没有&# 39,你发现的事情。因此,在临时阵列周围不会有任何方式,即使推力会自动进行#34;为你(它没有)。

如果空间绝对溢价,则将数组完整地复制到主机并在那里进行流压缩。但出于性能原因,我预计在设备上进行流压缩通常会更好,然后将(可能更小的)数组传输到主机。