2016-04-26 81 views
0

我收到的主旨的模板实例中的编译时错误尝试执行以下操作时:推力copy_if设备到主机

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

此操作可行吗?

不,不可以这样使用copy_if

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

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