如何从函子访问device_vector

问题描述 投票:0回答:1

我在正确创建函子以访问设备矢量时遇到了一些麻烦。基本上,我有两个要在函子内部使用的设备向量。函数在for_each期间被调用。

这里是我的函子:

struct likelihood_functor
{
int N;
float* v1;
float* v2;

likelihood_functor(int _N, float* _v1, float* _v2) : N(_N),v1(_v1),v2(_v2) {}
template <typename Tuple>

__host__ __device__ void operator()(Tuple t)
{
    float A = thrust::get<0>(t);
    float rho = thrust::get<1>(t);
    float mux = thrust::get<2>(t);
    float muy = thrust::get<3>(t);
    float sigx = thrust::get<4>(t);
    float sigy = thrust::get<5>(t);

    thrust::device_ptr<float> v1_p(v1);
    thrust::device_vector<float> X(v1_p,v1_p+N);
            thrust::device_ptr<float> v2_p(v2);
    thrust::device_vector<float> Y(v2_p,v2_p+N);

    thrust::get<6>(t) = 600*logf(A)
        - 600/2*logf(sigx*sigx*sigy*sigy*(1-rho*rho))
        - thrust::reduce(X.begin(),X.end())
        - thrust::reduce(Y.begin(),Y.end())
        - 2*rho/(sigx*sigy);
}
};

这是我的main():

int main(void)
{

// create a 2D dataset
const int N=2500; //number of counts

thrust::device_vector<float> data_x(N);
thrust::device_vector<float> data_y(N);

thrust::counting_iterator<unsigned int> begin(0);
    thrust::transform(begin,
        begin + N,
        data_x.begin(),
        get_normal(5.f,1.f,2.f));
thrust::transform(begin,
        begin + N,
        data_y.begin(),
        get_normal(5.f,1.f,2.f));

    //
    // Some code here to initiate A_n, rho_na, mux_n etc...
    //

// apply the transformation
thrust::for_each(
    thrust::make_zip_iterator( 
      thrust::make_tuple(A_n.begin(), rho_n.begin(), mux_n.begin(),  muy_n.begin(), sigx_n.begin(),sigy_n.begin(), L.begin()) 
    ), 
    thrust::make_zip_iterator( 
      thrust::make_tuple(A_n.end(), rho_n.end(), mux_n.end(), muy_n.end(), sigx_n.end(),sigy_n.end(),L.end())
    ), 
    likelihood_functor(N,thrust::raw_pointer_cast(&(data_x[0])),thrust::raw_pointer_cast(&(data_y[0])))
    );

// print the output
for(int i=0; i<4096; i++)
{
    std::cout << "[" << i << "] : " << L[i] <<std::endl;
}

}

代码会编译,但不会运行。我知道这是因为在我的函子中,device_vector X和Y未正确完成。

我在主函数中使用了相同的代码来创建X和Y,当我这样做时,程序运行良好(在这种情况下,我不调用函子)。与函子内部有什么不同,函子内部可以使某些程序在主程序中起作用,而不能在函子中起作用?

还有另一种做我想做的事吗?

谢谢您的帮助!

c++ cuda thrust
1个回答
1
投票

编辑:以下答案不再正确。推力算法可在CUDA设备代码中以多种方式使用,其中某些方法已涵盖herethrust::device_vector通常仍不能在CUDA设备代码中使用(尽管基础数据是可用的。)>


推力算法(例如变换,归约等)不能在cuda设备代码中使用。

这是__global____device__之前的任何功能都不能使用推力(例如,不能使用例如thrust::reduce。]

因此,您的仿函数无法使用设备代码,因为它使用推力结构(例如thrust::reduce

我知道你说过你的代码可以编译,但是我不确定我是否相信。如果尝试在thrust::device_vector代码中声明__device__,则会出现编译错误。由于您在此处显示的代码在许多方面都不完整,因此,由于您发布的内容存在其他问题,因此我无法轻松地用您的代码进行演示。

© www.soinside.com 2019 - 2024. All rights reserved.