我正在尝试在CUDA中做一个非常基本的例子。我想对浮点数列表进行简单的计算。
vh [x] * k1 + k2
目前,我正在尝试此操作,但无法正常工作:
代码1
#include#include #include #include #include #include using namespace std; using namespace thrust; float k1 = 42, k2 = 7; int main(void) { vector vh = { 0, 1, 2, 3, 4, 5, 6, 7 }; device_vector v = vh; device_vector v_out(v.size()); thrust::transform(v.begin(), v.end(), v_out.begin(), [=] __device__(float x) { return x*k1 + k2; }); for (size_t i = 0; i < v_out.size(); i++) std::cout << v_out[i] << std::endl; }
我在上面的代码中遇到了一个非常烦人的lambda函数错误,因此我尝试使用自定义函数,如下代码所示:
代码2
#include#include #include #include #include #include using namespace std; using namespace thrust; float k1 = 42, k2 = 7; float multiply(float x) { return x * k1 + k2; } int main(void) { vector vh = { 0, 1, 2, 3, 4, 5, 6, 7 }; device_vector v = vh; device_vector v_out(v.size()); thrust::negate op; thrust::transform(v.begin(), v.end(), v_out.begin(), multiply __device__(float x) ); for (size_t i = 0; i < v_out.size(); i++) std::cout << v_out[i] << std::endl; std::getwchar(); }
谁能告诉我为什么代码1和/或代码2不起作用?
对于代码2,必须将函数包装在一个对象中才能创建函子。
对于代码1,您必须使用--expt-extended-lambda
nvcc选项来启用完整的lambda支持。
你还必须声明k1
,k2
作为const
或不使其静态通过(例如)宣布它里面的main
。
除非您的lambda 非常简单,否则将functor用于生产代码。
查看以下代码以获取工作示例:
#include#include #include #include #include #include using namespace std; using namespace thrust; template struct saxpi{ T k1; T k2; saxpi(T _k1, T _k2){ k1=_k1; k2=_k2; } __host__ __device__ T operator()(T &x) const{ return x*k1+k2; } }; int main(void) { float kk1=1, kk2=5; vector vh = { 0, 1, 2, 3, 4, 5, 6, 7 }; device_vector v = vh; device_vector v_out(v.size()); cout<<"Lambda:"< f(kk1,kk2); v_out.clear(); v_out.resize(v.size()); thrust::transform(v.begin(),v.end(),v_out.begin(),f); for (size_t i = 0; i < v_out.size(); i++) std::cout << v_out[i] << std::endl; }
使用以下选项进行编译:-- expt-extended-lambda -std = c ++ 11
Lambda: 5 6 7 8 9 10 11 12 Functor: 5 6 7 8 9 10 11 12