クラスをカーネルに渡すC++ CUDAプログラムを作成したいと思います。クラスは、呼び出し演算子()を介してカーネル上の関数を評価するだけです。クラスの中で関数をハードワイヤリングすると、すべてがうまくいくように機能します。しかし、私はクラスにいくつかの柔軟性が必要なので、クラスを異なる関数でインスタンス化できるようにしたいと思います。ポインタ関数を渡すといいでしょう。ポインタ関数の実装を動作させることができません。私は、2つのクラス、機能(genericFunction)CUDA:クラス関数をクラスのメンバとする関数にポインタを渡す
//Functions.hh
#include <iostream>
#include <stdio.h>
class fixedFunction{
public:
__host__ fixedFunction() {}
__host__ __device__ double operator()(double x) {
return x*x;
}
};
double f1(double x){
return x*x;
}
typedef double (*pf) (double var);
class genericFunction{
public:
__host__ genericFunction(double (*infunc)(double)) : func(infunc){}
__host__ __device__ double operator()(double x) {
return func(x);
}
private:
pf func;
};
__global__ void kernel1(fixedFunction* g1){
unsigned int tid = blockIdx.x *blockDim.x + threadIdx.x;
printf("Func val is: %f\n", (*g1)(tid));
}
__global__ void kernel2(genericFunction* g1){
unsigned int tid = blockIdx.x *blockDim.x + threadIdx.x;
printf("Func val is: %f\n", (*g1)(tid));
}
両方のクラスをインスタンス化し、ホスト作品にそれらを実行しているへのポインタを取ります(fixedFunction)定義された機能を持つものと別の定義の下に。私は、そのクラスは、ポインタ機能を呼び出すことkernel2は、私は、ポインタ機能で問題が任意のサイズにすることができます見ることができ、それがデバイスで会計処理されていない関連するカーネルに
#include "Functions.hh"
int main(){
fixedFunction h_g1;
fixedFunction* d_g1;
cudaMallocManaged(&d_g1, sizeof(h_g1));
//Host call
std::cout << h_g1(2.0) << "\n";
//device call
kernel1<<<1,32>>>(d_g1);
cudaDeviceSynchronize();
genericFunction h_g2(f1);
genericFunction* d_g2;
cudaMallocManaged(&d_g2, sizeof(h_g2));
//Host call
std::cout << h_g2(3.0) << "\n";
//device call
kernel2<<<1,32>>>(d_g2);
cudaDeviceSynchronize();
を失敗を参照してください渡します。それで、ポインタ関数をクラスに渡してデバイス上で実行する方法はありますか?
おかげ
f1は、デバイスの機能ではありません。関数ポインタの設定が正しいかどうかにかかわらず、おそらくsカーネルを使うことはできません – talonmies