C++ 变换推力矢量的类型

C++ 变换推力矢量的类型,c++,cuda,thrust,C++,Cuda,Thrust,我对CUDA和STRACH有点陌生,目前我正在努力解决以下问题: 我有两个结构携带数据 struct S1 { unsigned long A, B, C; } struct S2 { double A, B, C; } 在程序开始时,我有一个第一个结构的向量,我想使用GPU和一个特殊的函子将S1的向量转换为S2的向量。结果的大小将与输入的大小相同,只有不同类型的元素 我当前正在使用此设置: struct Functor { Functor() {} __h

我对CUDA和STRACH有点陌生,目前我正在努力解决以下问题:

我有两个结构携带数据

struct S1 {
    unsigned long A, B, C;
}

struct S2 {
    double A, B, C;
}
在程序开始时,我有一个第一个结构的向量,我想使用GPU和一个特殊的函子将
S1
的向量转换为
S2
的向量。结果的大小将与输入的大小相同,只有不同类型的元素

我当前正在使用此设置:

struct Functor {
    Functor() {}

    __host__ __ device__ S2 operator() (const S1& s1) {
        // perform some operation on S1 to convert it so S2
        // here I just copy the values
        return S2{s1.A, s1.B, s1.C};
    }
}

void main() {
    std::vector<S1> input;
    // fill the 'input' vector

    // move the input to a device vector
    thrust::device_vector<S1> input_d(input);
    // empty vector for struct S2
    thrust::device_vector<S2> output_d(input.size());

    thrust::transform(input_d.begin(), input_d.end(), output_d.begin(), output_d.end(), Functor());

    return 0;
}
结构函子{ 函子(){} __主机设备S2运算符()(常数S1和S1){ //对S1执行一些操作,将其转换为S2 //这里我只是复制值 返回S2{s1.A,s1.B,s1.C}; } } void main(){ 向量输入; //填充“输入”向量 //将输入移动到设备向量 推力:设备矢量输入(输入); //结构S2的空向量 推力:设备向量输出(input.size()); 转换(输入\ d.开始(),输入\ d.结束(),输出\ d.开始(),输出\ d.结束(),函子()); 返回0; } 函子
函子
负责将
S1
转换为
S2
(在本例中简化)


此代码导致编译器错误,因为
运算符()
需要两个参数,而我只希望有一个输入。环顾网络,我没有找到一个适用于我的问题的解决方案。

正如我在评论中指出的那样,我误读了文档(请参阅)。解决方案是使用一元函子和另一种调用推力::变换的方法

// this functor converts values of S1 to S1 by multiplying them with .5
// in the actual scenario this method does perform much more useful operations
struct Functor : public thrust::unary_function<S1, S2> {
    Functor() {}

    __host__ __device__ S2 operator() (const S1& s1) const {
        // very basic operations on the values of s1
        double a = s1.A * .5;
        double b = s1.B * .5;
        double c = s1.C * .5;
        return S2{a, b, c};
    }
}

//此函子将S1的值乘以0.5,将其转换为S1
//在实际场景中,此方法确实执行更有用的操作
结构函子:公共推力::一元函数{
函子(){}
__主机\uuuuu\uuuu设备\uuuus2运算符()(常数S1和S1)常数{
//关于s1值的非常基本的运算
双a=s1.a*.5;
双b=s1.b*.5;
双c=s1.c*.5;
返回S2{a,b,c};
}
}
然后将转换称为:

thrust::host_vector<S1> tmp;
// fill the tmp vector with S1 instances...

// move the host vector to the device
thrust::device_vector<S1> input_d;
input_d = tmp; 

// initializing the output with the same size as the input
thrust::device_vector<S2> output_d(tmp.size()); 

// calling the functor on all elements of the input and store them in the output
thrust::transform(input_d.begin(), input_d.end(), output_d.begin(), Functor()); 
推力::主机向量tmp;
//用S1实例填充tmp向量。。。
//将主机向量移动到设备
推力:设备矢量输入;
输入=tmp;
//初始化与输入大小相同的输出
推力:设备矢量输出(tmp.size());
//对输入的所有元素调用functor并将它们存储在输出中
转换(输入\ d.开始(),输入\ d.结束(),输出\ d.开始(),函子());

编辑:添加了更多的代码部分,因此它实际上是工作代码。

您需要更仔细地查看
推力::转换的文档。你对情况的判断完全错了——@Talonmes是的,我明白了,谢谢。但是否决这个问题并不是一个好的举动。我误读了一些东西——这个问题仍然有效。transform调用仍然是错误的,并且函子没有按照您的问题暗示的方式执行操作。当我向您介绍API的文档时,我不仅指参数的数量,还指函数调用的模板参数。@Talonmes这正是我指定的,我已经很好地编译和运行了这段代码。取S1的向量,对每个元素执行一个操作,并将这些数据存储在S2元素的向量中。真的吗?所以你把Functor,一个类型,传递给transform调用?还有一个函子方法,它返回一个未初始化的S2实例,对S1数组中的输入数据执行长到双的转换,即使它根本不使用输入数据?我是impressed@talonmies我编辑代码以更准确地反映我正在做的事情。我确实先漏掉了一些部分,因为我想这会清楚到底是怎么回事。我希望你现在看到我试图实现的目标,它是这样运作的:)这个问题和答案的全部目的是为下一个有类似问题的人留下有用的线索,而不仅仅是帮助你。因此,一个草率的问题和一个不完整的答案无助于进一步实现目标,即使它帮助了你。因此,感谢您编辑您的答案,以便对未来的访问者更有用