0

私の以前の質問に答えて、誰かが私に次のコードをくれました:

thrust::device_vector<bool> bools;
thrust::device_vector<float> values;

typedef thrust::device_vector<bool>::iterator   BoolIterator;
typedef thrust::device_vector<float>::iterator  ValueIterator;
typedef thrust::tuple<BoolIterator, ValueIterator> IteratorTuple;
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 IteratorTuple& lhs, const IteratorTuple& lhs) 
  {
    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()); 

Predicate 構造体を理解したい。演算子が false を返すとどうなりますか? どの値が選択されますか? 演算子が true を返すとどうなりますか? どの値が選択されますか?

4

1 に答える 1

1

「より小さい」述語を実装しようとしました。truelhs <= rhs の場合は返され、それ以外の場合は false になります。さらに、2 番目の配列に格納されているブール値フラグによって値を除外するように要求したため、それをチェックします。

私のコメントから:

コードを最適化しすぎたと思います。これは「より小さい」述語です。ifcondition evaluatesfalseは one または bool フラグがfalseであることを意味するため、対応する値を除外する必要があります。したがって、lhs引数を除外する必要があるかどうかを確認(thrust::get<0>(lhs) == false)し、それが真の場合、述語は真を返します。これは、「lhs が rhs より小さい」ことを意味します。(thrust::get<0>(lhs) == true)、よりもコンポーネントを除外する必要があり、述語が false を返す場合、 rhs「lhs が rhs より小さくない」ことを意味します

次のコードを折りたたみました。

using thrust::get;
if (get<0>(lhs) && get<0>(rhs) ) return get<1>(lhs) <= get<1>(rhs); else 
// we need co check which value should be excluded from the seach
if (get<0>(lhs) == false) // lhs should be excluded so lhs is lesser
                          // OR both should be excluded and no matter what 
                          // we will return it will be eliminated in other comparison
  return true; else
if (get<0>(rhs) == false) // rhs should be excluded so rhs is lesser
  return false;
于 2012-12-21T12:30:53.900 に答える