超音波流体屋のプログラム備忘録

CUDA 3.2

最終更新:

usapfrog

- view
管理者のみ編集可
いわゆるところのHello world的なのがちょっと長め

[以下cuda 3.2の話]

開始から終わりまで

gpuinc.cu : 単純に2だけ足すだけのプログラム
  1. #include <stdio.h>
  2. #include <cutil.h>
  3.  
  4. #define DATASIZE 10000
  5. #define THREADNUM 100
  6.  
  7. __constant__ double gpuinc; //コンスタントメモリ
  8. __global__ cudaKernel(double *gpumem){
  9. int id = blockIdx.x*blockDim.x+threadIdx.x;
  10. gpumem[id] += gpuinc;
  11. }
  12.  
  13. int main(int argc, char** argv){
  14. double *hostmem, *gpumem;
  15.  
  16. //host側の準備
  17. double hostinc = 2.0;
  18. hostmem = (double *)calloc(sizeof(double), DATASIZE);
  19. for(int i=0; i<DATASIZE;i++) hostmem[i] = i;
  20.  
  21. //gpu側の準備・メモリの確保
  22. CUT_DEVICE_INIT(argc, argv);
  23. CUDA_SAFE_CALL(cudaMalloc((void**) &gpumem, sizeof(double)*DATASIZE));
  24.  
  25. //データの転送(Host -> GPU)
  26. CUDA_SAFE_CALL(cudaMemcpy(gpumem, hostmem, sizeof(double)*DATASIZE, cudaMemcpyHostToDevice));
  27. CUDA_SAFE_CALL(cudaMemcpyToSymbol(gpuinc, &hostinc, sizeof(double)*1));
  28.  
  29. //cutilのタイマーを使う
  30. unsigned int timer = 0;
  31. CUT_SAFE_CALL( cutCreateTimer( &timer));
  32. CUT_SAFE_CALL( cutStartTimer( timer));
  33.  
  34. //gpuで計算を回す
  35. cudaKernel <<< (DATASIZE/THREADNUM), THREADNUM >>>(gpumem);
  36.  
  37. //タイマー停止
  38. CUT_SAFE_CALL( cutStopTimer( timer));
  39.  
  40. //データの受け取り(GPU -> Host)
  41. CUDA_SAFE_CALL(cudaMemcpy(hostmem, gpumem, sizeof(double)*DATASIZE, cudaMemcpyDeviceToHost));
  42.  
  43. //結果の表示
  44. for(int i=0;i<DATASIZE;i++) printf("x[%d] = %f\n", i, hostmem[i]);
  45. printf("Elapsed time : %f (ms)\n", cutGetTimerValue(timer));
  46.  
  47. //メモリの開放・終了処理
  48. free(hostmem);
  49. CUDA_SAFE_CALL(cudaFree(gpumem));
  50. CUT_SAFE_CALL( cutDeleteTimer( timer));
  51. CUT_EXIT(argc, argv);
  52. return 0;
  53. }
  54.  

コンパイル

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

参考

目安箱バナー