7
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C++/CLI からCUDAカーネルを呼ぶ

Last updated at Posted at 2015-03-13

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 を使ってください。
くわしくはコチラ

7
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?