2016-11-08 5 views
0

デバイスデータ構造への参照を状態として格納するThrustを使用してデバイスファンクタを作成しようとしています。ファンクタはthrust::transform()と友達に渡されます。変換中に、さまざまな方法でoctetsのビットにアクセスしているこれを行うで終了目標の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; 
} 

ワン:問題は、私はファンクタのreturn声明で、デバイスコードからホスト機能を呼び出すことについて、エラーを取得していますされます例えば、3番目のビットの5番目のセット、4番目のビットの10番目のセットなどを取得するなど、私はファンクタを動作させることができます。

+3

これが原因ファンクタ内device_vectorのこれまでの作業のチャンスを持っていません。それがエラーの原因であり、修正する方法はありません。 – talonmies

+3

答えを含む「編集1:」であなたの質問を修正するのではなく、単に回答を投稿するのはなぜですか?または、好きな場合は、これを、デバイスコードで推力ベクトルを直接使用することを頼む他の推力質問の重複としてマークすることができます。 –

+0

この修正を行い、質問に回答します。 1つの質問がデバイスコードでの推力ベクトルの作成とデバイスコードでの推力ベクトルの作成について質問していたので、重複としては見えませんでした。 –

答えて

1

@talonmiesによるコメントに対処するためにthusly数子を再書き込みは、トリックを行うために表示されます。

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; 
}; 
関連する問題