最終更新: mikk_ni3_92 2008年10月01日(水) 11:17:37履歴
現在地 >> メニュー >> CUDA >> CUDA::基本編01
INDEX:基本編01 >> CUDA::基本編02
初期化は
CUT_DEVICE_INIT();
で行う。
[例]
※古いバージョンでは引数がなかったが、
cuda2.0ではCUT_DEVICE_INIT()に引数をわたす必要がある。
GPUのメモリを確保するには、「cudaMalloc関数」を使う
[例]
※C言語の場合(void**)でキャスト。
GPUとCPU間データ転送は、「cudaMemcpy()関数」を使う。
GPUでの計算は、「__global__関数」が
最初に実行されるmain関数のようなものである。
[例]
INDEX:基本編01 >> CUDA::基本編02
初期化は
CUT_DEVICE_INIT();
で行う。
[例]
int main(int argc,char **argv) { CUT_DEVICE_INIT(argc,argv); ... ... }
※古いバージョンでは引数がなかったが、
cuda2.0ではCUT_DEVICE_INIT()に引数をわたす必要がある。
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**)でキャスト。
GPUとCPU間データ転送は、「cudaMemcpy()関数」を使う。
float* x; //CPU側のデータ ... ... float* gpu_x;//GPU側のデータ ... ... CUDA_SAFE_CALL( cudaMemcpy( gpu_x, x, DataSize , cudaMemcpyHostToDevice));
GPUでの計算は、「__global__関数」が
最初に実行されるmain関数のようなものである。
[例]
__global__ void GpuFunction(引数)
{
//------- GPU上での計算 ---------//
}
cudaStream_t型で何かのストリームと関連づける時に使う。(これもオプションでデフォルトは0)
つまり「<<<Dg, Db, Ns, S>>>」には、何個のブロックを使い、その各ブロックがどの程度のスレッドを使うかを指定する。
※この「スレッド数」や、「shared memory」には指定できる限界値が存在し、GPU毎に異なる。
デバイス情報を取得して確認する等をする。
[例]
この場合、1ブロックでそのスレッド数はAryElem個という指定をしている。
つまり「<<<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個という指定をしている。