超音波流体屋のプログラム備忘録
CUDA 3.2
最終更新:
usapfrog
-
view
いわゆるところのHello world的なのがちょっと長め
[以下cuda 3.2の話]
開始から終わりまで
gpuinc.cu : 単純に2だけ足すだけのプログラム
- #include <stdio.h>
- #include <cutil.h>
-
- #define DATASIZE 10000
- #define THREADNUM 100
-
- __constant__ double gpuinc; //コンスタントメモリ
- __global__ cudaKernel(double *gpumem){
- int id = blockIdx.x*blockDim.x+threadIdx.x;
- gpumem[id] += gpuinc;
- }
-
- int main(int argc, char** argv){
- double *hostmem, *gpumem;
-
- //host側の準備
- double hostinc = 2.0;
- for(int i=0; i<DATASIZE;i++) hostmem[i] = i;
-
- //gpu側の準備・メモリの確保
- CUT_DEVICE_INIT(argc, argv);
- CUDA_SAFE_CALL(cudaMalloc((void**) &gpumem, sizeof(double)*DATASIZE));
-
- //データの転送(Host -> GPU)
- CUDA_SAFE_CALL(cudaMemcpy(gpumem, hostmem, sizeof(double)*DATASIZE, cudaMemcpyHostToDevice));
- CUDA_SAFE_CALL(cudaMemcpyToSymbol(gpuinc, &hostinc, sizeof(double)*1));
-
- //cutilのタイマーを使う
- unsigned int timer = 0;
- CUT_SAFE_CALL( cutCreateTimer( &timer));
- CUT_SAFE_CALL( cutStartTimer( timer));
-
- //gpuで計算を回す
- cudaKernel <<< (DATASIZE/THREADNUM), THREADNUM >>>(gpumem);
-
- //タイマー停止
- CUT_SAFE_CALL( cutStopTimer( timer));
-
- //データの受け取り(GPU -> Host)
- CUDA_SAFE_CALL(cudaMemcpy(hostmem, gpumem, sizeof(double)*DATASIZE, cudaMemcpyDeviceToHost));
-
- //結果の表示
-
- //メモリの開放・終了処理
- CUDA_SAFE_CALL(cudaFree(gpumem));
- CUT_SAFE_CALL( cutDeleteTimer( timer));
- CUT_EXIT(argc, argv);
- return 0;
- }
-
コンパイル
nvcc -lcutil -arch=sm_13 gpuinc.cu -o gpuinc.out linuxだと -lcutil_x86_64とかになるかも
環境変数に入れとくもの
おまじない的に無駄なのもはいってるかも
linux
- LIBRATY_PATH, LD_LIBRARY_PATH=にcutil.aのパス
どっか/NVIDIA_GPU_Computing_SDK/3.2/C/lib
- C_INCLUDE_PATH, CPLUS_INCLUDE_PATHに
どっか/NVIDIA_GPU_Computing_SDK/3.2/C/inc
mac
上記に加え、
DYLD_LIBRARY_PATH=/usr/local/cuda/lib