2017-12-20 19 views
0

私はスラストファンクタ内でデバイスファンクションを呼びたいと思いますが、起動方法はわかりません。ファンクタのサイズが大きいため、関数に分割する必要があるため、これは明らかに必要です。Thrustファンクタ内のデバイス関数を呼び出すことは可能ですか?

最小の例が認められます。

は、あなたはそれが普通のCUDA C++コードで行われるだろうかと非常によく似た方法でこれを行うだろう

+0

何デバイスの機能? CUDAの数学図書館からの何か、またはあなたが書いた何か? – talonmies

+0

これはデバイスで実行するために書き込む関数です。それは__device__で指定されています –

答えて

1

ありがとうございます。 __device__関数を定義して(おそらく__host____device__)、通常のCUDAデバイスコードと同じように定義し、CUDAデバイスコードの他の場所と同じように、推力ファクタ演算子で使用します。ここで

は関手のオペレータから__host__ __device__関数を呼び出すだけでなく、内蔵の数学ライブラリ関数ファンクタのオペレータからCUDAを呼び出すを示して簡単な例です:

$ cat t9.cu 
#include <iostream> 
#include <thrust/transform.h> 
#include <thrust/device_vector.h> 
#include <thrust/copy.h> 
#include <vector> 
#include <math.h> 

template <typename T> 
__host__ __device__ T square(T &s){ 
    return s*s; 
} 

struct my_math 
{ 
    __host__ __device__ 
    float operator()(float &r){ 
    return log2f(square(r)); 
    } 
}; 

int main(){ 

    std::vector<float> h_data = {1,2,4,8,16}; 
    thrust::device_vector<float> d_data = h_data; 
    thrust::transform(d_data.begin(), d_data.end(), d_data.begin(), my_math()); 
    thrust::copy(d_data.begin(), d_data.end(), std::ostream_iterator<float>(std::cout, ",")); 
    std::cout << std::endl; 
} 


$ nvcc -arch=sm_35 -std=c++11 -o t9 t9.cu 
$ ./t9 
0,2,4,6,8, 
$ 
+0

ありがとう、Crovella氏。私はあなたのコードを試して、うまくいきました。つまり、コードのどこかにバグがあります。私はこの投稿の前に突き出したギターのサンプルを見つけることができませんでした –

関連する問題