11. CUDA プログラミング
Basic CUDA C Language
✓ CUDA C Languageとは?
- CUDAのカーネルを書くための言語
- 文法はほぼC/C++、ただし標準Cライブラリ等は使用できない
✓ 文法要素
- __global__ void func(...)でfuncがカーネルとしてコンパイルされる
- __device__ void func(...)でfuncがデバイス関数
(カーネルから呼び出せる関数)としてコンパイルされる
さて、CUDAスレッドとカーネルという言葉が出てきましたね。これについて説明します。\n\nGPUは、数万というCUDAスレッドを数百のCUDAコアで並列処理するという実行モデルを持っています。CUDAカーネルは、CUDAスレッドの処理内容を記述するためのもので、__global__という識別子を関数の先頭に付けると、それがCUDAカーネルになります。\n\n= Live =\nCUDAカーネルのスタブを書く\n
さて、CUDAスレッドとカーネルという言葉が出てきましたね。これについて説明します。\n\nGPUは、数万というCUDAスレッドを数百のCUDAコアで並列処理するという実行モデルを持っています。CUDAカーネルは、CUDAスレッドの処理内容を記述するためのもので、__global__という識別子を関数の先頭に付けると、それがCUDAカーネルになります。\n\n= Live =\nCUDAカーネルのスタブを書く\n
さて、CUDAスレッドとカーネルという言葉が出てきましたね。これについて説明します。\n\nGPUは、数万というCUDAスレッドを数百のCUDAコアで並列処理するという実行モデルを持っています。CUDAカーネルは、CUDAスレッドの処理内容を記述するためのもので、__global__という識別子を関数の先頭に付けると、それがCUDAカーネルになります。\n\n= Live =\nCUDAカーネルのスタブを書く\n
さて、CUDAスレッドとカーネルという言葉が出てきましたね。これについて説明します。\n\nGPUは、数万というCUDAスレッドを数百のCUDAコアで並列処理するという実行モデルを持っています。CUDAカーネルは、CUDAスレッドの処理内容を記述するためのもので、__global__という識別子を関数の先頭に付けると、それがCUDAカーネルになります。\n\n= Live =\nCUDAカーネルのスタブを書く\n
さて、CUDAスレッドとカーネルという言葉が出てきましたね。これについて説明します。\n\nGPUは、数万というCUDAスレッドを数百のCUDAコアで並列処理するという実行モデルを持っています。CUDAカーネルは、CUDAスレッドの処理内容を記述するためのもので、__global__という識別子を関数の先頭に付けると、それがCUDAカーネルになります。\n\n= Live =\nCUDAカーネルのスタブを書く\n
さて、CUDA APIとCUDAの拡張構文についてですが、必要なのは全部でたった4つです。\nGPUは専用のメモリ空間を持っており、このメモリ空間のアロケーションに使用するのがcudaMallocとcudaFreeです。\nまた、CPU側のメモリとの間のデータのコピーはcudaMemcpyというAPIを使用します。\n\nそして、カーネルと呼ばれるGPUプログラムの呼び出しには、CUDAの拡張文法を使用します。\nこのようにアングルブラケットをカーネル関数の前に付け、nvccでコンパイルすると、\nカーネルの呼び出しとして解釈されます。\n\n= Live =\nCUDA APIを使用したホストコードを作成する\n
CUDAカーネル内部では、いくつかの特殊な組み込み関数や変数が使用できます。今回は、threadIdxという組み込み変数のみを使用します。この変数は、そのカーネルを実行するCUDAスレッドのIDを格納しており、CUDAスレッドごとに違う変数を取得できます。\n\n= Live =\nカーネルを実装\n関数オブジェクトを実装し、関数に__device__識別子を付ける\n