Hello CUDA!

提供: メモ帳@fmaj7b5.info
移動: 案内検索

新しい言語を始めるときの作法。まずはHello world的な何かを書いてみた。 これには間違いなくコンパイルできるソースを使ってプログラム環境が正しく設定されているか確認する意味がある、とか無いとか。

Hello CUDA!

hello.cu:

using namespace FM7b5;
 
__device__ const char str[] = "Hello CUDA!";
 
__global__ void hello(char* buf)
{
	const size_t idx = threadIdx.x;
 
	if (idx < sizeof(str)) {
		buf[idx] = str[idx];
	}
}
 
void FM7b5::hello_gpu(char* buf)
{
	const size_t num_str(sizeof(str));
	char* d_buf(nullptr);
 
	cudaMalloc(&d_buf, sizeof(char) * num_str);
 
	hello<<<1, num_str>>>(d_buf);
 
	cudaMemcpy(buf, d_buf, sizeof(char) * num_str, cudaMemcpyDeviceToHost);
 
	cudaFree(d_buf);
}

hello_gpu()が普通の(C++の)関数で、hello()がGPUで実行される関数。まあ、ほぼC/C++と同じ。見慣れない__global__とか__device__とかはその関数や変数がCPU (host)用かGPU (device)用かなんかをコンパイラに教えるためのもの。

__global__ hostから呼べるdeviceの関数。戻り値無し。
__device__ device上で実行される関数の中からのみ呼べる関数。
__host__ host上で実行される関数。CPU用の普通の関数。
(何も無し) おそらく__host__と同じ。

で、<<<...>>>が同時に走らせるスレッド数を指示するやつ。詳しくはマニュアルを・・。