私はスラストファンクタ内でデバイスファンクションを呼びたいと思いますが、起動方法はわかりません。ファンクタのサイズが大きいため、関数に分割する必要があるため、これは明らかに必要です。Thrustファンクタ内のデバイス関数を呼び出すことは可能ですか?
最小の例が認められます。
は、あなたはそれが普通のCUDA C++コードで行われるだろうかと非常によく似た方法でこれを行うだろう
私はスラストファンクタ内でデバイスファンクションを呼びたいと思いますが、起動方法はわかりません。ファンクタのサイズが大きいため、関数に分割する必要があるため、これは明らかに必要です。Thrustファンクタ内のデバイス関数を呼び出すことは可能ですか?
最小の例が認められます。
は、あなたはそれが普通のCUDA C++コードで行われるだろうかと非常によく似た方法でこれを行うだろう
ありがとうございます。 __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,
$
ありがとう、Crovella氏。私はあなたのコードを試して、うまくいきました。つまり、コードのどこかにバグがあります。私はこの投稿の前に突き出したギターのサンプルを見つけることができませんでした –
何デバイスの機能? CUDAの数学図書館からの何か、またはあなたが書いた何か? – talonmies
これはデバイスで実行するために書き込む関数です。それは__device__で指定されています –