当前位置:  开发笔记 > 后端 > 正文

Thrust :: transform自定义函数

如何解决《Thrust::transform自定义函数》经验,为你挑选了1个好方法。

我正在尝试在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不起作用?



1> Davide Spata..:

对于代码2,必须将函数包装在一个对象中才能创建函子。

对于代码1,您必须使用--expt-extended-lambdanvcc选项来启用完整的lambda支持。

你还必须声明k1k2作为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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有