2016-04-26 79 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之後執行設備 - >主機傳輸(它不會像您那樣做)已發現)。所以即使推力會「自動」爲你做(它不會),也不會有任何方法繞過臨時陣列。

如果空間是絕對的溢價,那麼將數組完整地複製到主機並在那裏進行流壓縮。但出於性能方面的考慮,我預計在設備上進行流式壓縮通常會更好,然後將(可能較小的)陣列傳輸到主機。