現在地 >> メニュー >> CUDA >> CUDA::基本編01
INDEX:基本編01 >> CUDA::基本編02

CUDAの基本的な使い方


CUDAを使った計算は以下のような感じで行う。
  1. CUDAの初期化
  2. GPU側のメモリ確保
  3. GPUにデータを転送し計算する
  4. 計算結果をメインメモリへもどす

※後はメモリ解放など


[1].CUDAの初期化


初期化は
  CUT_DEVICE_INIT();
で行う。

[例]

int main(int argc,char **argv)
{
        CUT_DEVICE_INIT(argc,argv);
        ... ...
}


※古いバージョンでは引数がなかったが、
cuda2.0ではCUT_DEVICE_INIT()に引数をわたす必要がある。



[2].GPUの確保


GPUのメモリを確保するには、「cudaMalloc関数」を使う

[例]

        ... ...
float *gpu_x;

int DataSize = sizeof(float) * AryElem;
const int AryElem = 100; //要素数
CUDA_SAFE_CALL(cudaMalloc( reinterpret_cast<void**>( &gpu_x), DataSize) ); //メモリ確保

        ... ...

cudaFree(gpu_x);//メモリ解放


※C言語の場合(void**)でキャスト。

[3].GPU側へのデータ転送と計算

GPUへのデータ転送


GPUとCPU間データ転送は、「cudaMemcpy()関数」を使う。


float* x;  //CPU側のデータ
... ...
float* gpu_x;//GPU側のデータ
... ...
CUDA_SAFE_CALL( cudaMemcpy( gpu_x, x, DataSize , cudaMemcpyHostToDevice));


GPUでの計算


GPUでの計算は、「__global__関数」が
最初に実行されるmain関数のようなものである。

[例]

__global__ void GpuFunction(引数)
{
     //------- GPU上での計算 ---------//
}


CPU側での記述方法


CPU側での記述には、
関数名<<<Dg, Db, Ns, S>>>(引数)
の形式をとる。

Dg

dim3型で、次元とグリッドサイズを指定。
→ (Dg.x * Dg.y) が ブロック数となる。Dg.zは使用しない。

Db

dim3型で、次元と各ブロックのサイズを指定。
→  (Db.x * Db.y)が各ブロックのスレッド数になる。

Ns

size_t(unsigned char)型でshared Memoryのサイズを指定。
(ブロック単位で動的なメモリ確保をする)
なお、これはオプションでありデフォルトは0が指定される。

S

cudaStream_t型で何かのストリームと関連づける時に使う。(これもオプションでデフォルトは0)


つまり「<<<Dg, Db, Ns, S>>>」には、何個のブロックを使い、その各ブロックがどの程度のスレッドを使うかを指定する。

※この「スレッド数」や、「shared memory」には指定できる限界値が存在し、GPU毎に異なる。
デバイス情報を取得して確認する等をする。



[例]

__global__ void GpuFunction(float *input); //宣言
... ...
dim3 threads(AryElem,1,1); //スレッドAryElem個
dim3 grid(1,1,1); //Dg は 1;
GpuFunction<<<grid,threads>>>(gpu_x);
... ...

__global__ void GpuFunction(float *input)  //関数の中身
{
	... ...
	__syncthreads(); //同期をとる
}


この場合、1ブロックでそのスレッド数はAryElem個という指定をしている。



[4].計算結果をメインメモリへもどす


計算結果をメインメモリへ戻すときも「cudaMemcpy()関数」を使う。


float* x;  //CPU側のデータ
... ...
float* gpu_x;//GPU側のデータ
... ...
CUDA_SAFE_CALL( cudaMemcpy( x, gpu_x,DataSize, cudaMemcpyDeviceToHost) );
cudaFree(gpu_x); //メモリ解放

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます