2016-11-08 87 views
0

我试图用Thrust创建设备仿函数,它将存储对设备数据结构的引用作为它们的状态。函子然后会被传入thrust::transform()和朋友。问题是我收到关于在仿函数的return声明呼吁从设备码中的主机功能错误:用Thrust创建和使用设备仿函数

// Compile with: 
// nvcc --std=c++11 device_functor.cu -o device_functor 

#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/complex.h> 

#include <iostream> 
#include <iomanip> 

struct my_functor { 
    my_functor(thrust::device_vector<unsigned char> &octets_) : 
     octets(octets_) {}; 

    __device__ 
    unsigned char operator()(int idx) const { 
     return octets[idx]; 
    } 
private: 
    thrust::device_vector<unsigned char> &octets; 
}; 


int main() { 
    thrust::device_vector<unsigned char> d_octets (4); 

    my_functor foo(d_octets); 

    d_octets[0] = 0x00; 
    d_octets[1] = 0x01; 
    d_octets[2] = 0x02; 
    d_octets[3] = 0x03; 

    std::cout << "0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast <int> (foo(2)) << std::endl; 

    return 0; 
} 

其中一个在做这个正在访问该位的最终目标在octets以各种方式的转变,例如抓住第三组三位,第十组四位等,这一切都很容易,一旦我可以得到函子的工作。

+3

这有根本不可能工作,因为函子内device_vector的机会。这是错误的根源,并且没有办法解决它。 – talonmies

+3

为什么不只是发布一个答案,而不是用包含答案的“编辑1:”修改你的问题?或者,如果您愿意,我可以将其标记为其他推力问题的重复,询问如何直接在设备代码中使用推力矢量。 –

+0

将做出此修复并标记回答的问题。我没有把它看作是一个重复的东西,因为有一个问题是关于在设备代码中创建推力矢量,而另一个则是在设备代码中使用它们。 –

回答

1

重新写仿函数正是如此通过@talonmies解决注释出现这样的伎俩:

struct my_functor { 
    my_functor(thrust::device_vector<unsigned char> &octets) : 
     octet_ptr(thrust::raw_pointer_cast(&octets[0])) {}; 

    __device__ 
    unsigned char operator()(int idx) const { 
     return *(octet_ptr + idx); 
    } 

private: 
    unsigned char *octet_ptr; 
};