转换推力矢量的类型

Transform the type of a thrust vector

我对 CUDA 和 thrust 有点陌生,我目前正在为以下问题而苦苦挣扎:

我有 2 个结构体携带数据。

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

struct S2 {
    double A, B, C;
}

在程序开始时,我有一个第一个结构的向量,我想使用 GPU 和一个特殊的仿函数将 S1 的向量转换为 [=13= 的向量].结果将与输入具有相同的大小,只是元素类型不同。

我目前正在使用此设置:

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;
}

函子Functor负责将S1转换为S2(在本例中已简化)。

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

正如评论中已经指出的那样,我误读了文档(参见 here)。解决方案是使用一元函子和另一种调用 thrust::transform.

的方法
// 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};
    }
}

转换称为:

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()); 

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