CUDA入門 > サンプル入門・初級編 > GPUで並列計算

GPUで並列計算


ソース
#include <stdio.h> #include <cutil.h> #define N 100 // カーネル(GPUの関数) __global__ void cudaKernel(int *gpu){ // スレッドID gpu[threadIdx.x] += 1; } int main(int argc, char** argv){ int *x; int *gpu; //デバイスの初期化 CUT_DEVICE_INIT(argc, argv); // xの初期化 x = (int *)calloc(sizeof(int), N); for(int i = 0; i < N; i++){ x[i] = i; } // デバイス(GPU)のメモリ領域確保 CUDA_SAFE_CALL(cudaMalloc((void**)&gpu, sizeof(int)*N)); // ホスト(CPU)からデバイス(GPU)へ転送 CUDA_SAFE_CALL(cudaMemcpy(gpu, x, sizeof(int)*N, cudaMemcpyHostToDevice)); // スレッド数、ブロック数の設定(説明は他のページ) dim3 blocks(1,1); dim3 threads(N,1); // カーネル(GPUの関数)実行 cudaKernel<<< blocks, threads >>>(gpu); // デバイス(GPU)からホスト(CPU)へ転送 CUDA_SAFE_CALL(cudaMemcpy(x, gpu, sizeof(int)*N, cudaMemcpyDeviceToHost)); for(int i = 0; i < N; i++){ // x[i]の結果が変わっていれば出力 if(i != x[i]){ printf("x[%d] = %d\n", i, x[i]); } } // ホストメモリ解放 free(x); // デバイスメモリ解放 CUDA_SAFE_CALL(cudaFree(gpu)); // 終了処理 CUT_EXIT(argc, argv); return 0; }

実行例
x[0] = 1 x[1] = 2 x[2] = 3 x[3] = 4 x[4] = 5 (略)

ソースの説明
GPUで計算を並列化させたソースです。

まず、カーネルからループが消えています。

gpu[threadIdx.x] += 1;
ホストで指定したX方向のスレッドを使い、同じ処理を行います。

次に、ホストのthreadsの値が変わっています。

dim3 threads(N,1);
ここでスレッド数を指定しています。
スレッド数は、3次元まで指定可能で、合計で最大512となります。
各次元の最大スレッド数は、512,512,64です。
※詳しくは別のページで説明します。