C#/VB.NET でCUDAを使うべく、C++/CLIでカーネルを呼び出すアセンブリ(DLL)を作ります。
このとき、kernel.cu にどう書くか。
kernel.cu
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
__global__ void kernel_func(const float* input, float* output, int size) {
...
}
namespace CUDA {
ref class Sample {
public:
static void wrapped_func() {
...
kernel_func<<<grid, block>>>(in,out,size);
...
}
}
}
残念ながらダメなんです。nvccは純なC++コード以外受け付けてくれません。
なのでホスト側コードは.cuではなく、.cppに書かなくてはなりません。
しかしながら.cppには kernel_func<<<grid, block>>>(in,out,size);
とは書けません。
<<<...>>>
の部分はnvccでないと通常のC++コードに展開されませんから。
kernel_func<<<grid, block>>>(in,out,size);
と等価なC++コードは以下のようになります。
host.cpp
__global__ void kernel_func(const float* input, float* output, int size);
dim3 grid;
dim3 block;
const float* in;
float* out;
int size;
cudaConfigureCall(grid,block); // <<<grid,block>>>
size_t offset = 0;
cudaSetupArgument(in, offset); offset += sizeof(in); // 1'st arg
cudaSetupArgument(out, offset); offset += sizeof(out); // 2'nd arg
cudaSetupArgument(size, offset); offset += sizeof(size); // 3'rd arg
cudaLaunch((const void*)&kernel_func); // launch!
[追記]
CUDA 7.0 以降、cudaLaunch は deprecated となりました。かわりに cudaLaunchKernel を使ってください。
くわしくはコチラ。