使用三元运算符的推力占位符时的编译器错误?:

时间:2015-07-17 03:36:20

标签: cuda thrust

我正在使用Thrust 1.8,当我尝试编译以下代码时出现两个编译器错误:

#include <thrust/device_vector.h>
#include <thrust/functional.h>


int main(int argc, char* argv[])
{
    thrust::device_vector<bool> condition(100); 
    thrust::device_vector<int> input(100); 
    thrust::device_vector<float> result(100);
    float mean = 10.4f;

    thrust::transform(condition.begin(),condition.end(),input.begin(),result.begin(), ( (thrust::placeholders::_1 ) ? ( thrust::placeholders::_2) : (mean) ) );
}

当我尝试编译时,我得到以下编译器时间错误:

(对于占位符:: _ 1)

  

错误:表达式必须是bool类型(或可转换为bool)

(对于占位符:: _ 2)

  

错误:操作数类型不兼容(&#34; const thrust :: detail :: functional :: actor&lt; thrust :: detail :: functional :: argument&lt; 1U&gt;&gt;&#34;&#34 ;浮动&#34)

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您不能像您尝试的那样使用占位符,即与三元运算符结合使用。

相反,您可以创建自己的仿函数:

struct my_fun : public thrust::binary_function<bool,float,float>
{
   float mean;
   my_fun(float mean) : mean(mean) {}
   __host__ __device__
   float operator()(bool condition, float input) const
   {
        float result = mean;
        if (condition)
        {
             result = input;
        }
        return result;
    }
};

...

thrust::transform(condition.begin(),
                  condition.end(),
                  input.begin(),
                  result.begin(),
                  my_fun(mean));