2012-12-21 63 views
1

我想使用thrust::reduce找到陣列A.然而,A[i]應僅被選擇爲最大的最大值,如果它也滿足在另一個數組B中的特定布爾條件的應用減少操作例如,B [i]應該是真的。他們的推力::減少版本是這樣做的。我查看了文檔,發現只有以下API;使用推力受布爾條件

thrust::reduce(begin,end, default value, operator) 

但是,我很好奇他們的一個版本更適合我的問題嗎?

編輯:編譯失敗,在最後一行!

 typedef thrust::device_ptr<int> IntIterator; 
     typedef thrust::device_ptr<float> FloatIterator; 
     typedef thrust::tuple<IntIterator,FloatIterator> IteratorTuple; 
     typedef thrust::zip_iterator<IteratorTuple> myZipIterator; 
     thrust::device_ptr<int> deviceNBMInt(gpuNBMInt); 
    thrust::device_ptr<int> deviceIsActive(gpuIsActive); 
    thrust::device_ptr<float> deviceNBMSim(gpuNBMSim); 

    myZipIterator iter_begin = thrust::make_zip_iterator(thrust::make_tuple(deviceIsActive,deviceNBMSim)); 
    myZipIterator iter_end = thrust::make_zip_iterator(thrust::make_tuple(deviceIsActive + numRow,deviceNBMSim + numRow)); 
    myZipIterator result = thrust::max_element(iter_begin, iter_end, Predicate()); 

回答

0

是的,有。我想你應該看看ExtremaZip iterator

像這樣的東西應該做的伎倆(不知道這個代碼工作的開箱):

typedef thrust::device_ptr<bool> BoolIterator; 
typedef thrust::device_ptr<float> ValueIterator; 

BoolIterator bools_begin, bools_end; 
ValueIterator values_begin, values_end; 
// initialize these pointers 
// ... 

typedef thrust::tuple<BoolIterator, ValueIterator> IteratorTuple; 
typedef thrust::tuple<bool, value> DereferencedIteratorTuple; 
typedef thrust::zip_iterator<IteratorTuple> ZipIterator; 

ZipIterator iter_begin(thrust::make_tuple(bools_begin, values_begin)); 
ZipIterator iter_end(thrust::make_tuple(bools_end, values_end)); 

struct Predicate 
{ 
    __host__ __device__ bool operator() 
         (const DereferencedIteratorTuple& lhs, 
         const DereferencedIteratorTuple& lhs) 
    { 
    using thrust::get; 
    if (get<0>(lhs) && get<0>(rhs)) return get<1>(lhs) < get<1>(rhs); else 
    return ! get<0>(lhs) ; 
    } 
}; 

ZipIterator result = thrust::max_element(iter_begin, iter_end, Predicate()); 

或者你可以考慮用拉鍊類似的技術迭代器與thrust::reduce。或者你可以嘗試inner_product不知道什麼工作會更快。

+0

什麼是<0>(lhs)的意思。另外,如果if條件評估爲false,會發生什麼情況? – Programmer

+0

@程序員對不起,它應該是'thrust :: get <0>(lhs)'。這裏描述http://thrust.github.com/doc/group__tuple.html#ga4512fb8e91a457663ce15cb72b5ccd9e –

+0

如果if條件的計算結果爲false會發生什麼? – Programmer