【问题标题】:thrust copy_if device to host将 copy_if 设备推到主机
【发布时间】:2016-04-26 22:35:50
【问题描述】:

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

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 缓冲区?

【问题讨论】:

    标签: c++ cuda thrust


    【解决方案1】:

    这个操作可以吗?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多