勉強してわかったこと教えて下さい:

メモ

CUDA

  • すごくはやい
    • MBA late 2010のGeforce 320MですらULV C2Dよりずっとはやい。
  • 多粒子系などデータセットが大きいときよいと思います。
    • ただ、メモリ参照がコンフリクトすると待たされるらしい。相互作用が複雑なときは注意したほうがよいかも。まあそこまでは気にならないですが。
  • thread(3次元)とblock(2次元)という単位で実行
    • GPUには複数のプロセッサがあり、それぞれのプロセッサが複数スレッドを実行する
  • なるべく複数プロセッサで複数スレッドを実行させたほうがよい
    • 1次元配列だと工夫が要りそうですね。
  • 多次元配列は扱えない。1次元でなくてはいけない。
    • #define GET_SUFFIX(i, j, n) ( (i) * (n) + (j) ) みたいなことをすればよい。
  • メモリアクセスは遅め。
    • なるべくCPU-GPU間のコピーは少ないほうがよさそう。
    • GPU中でのメモリ参照も少なくすべき
      • shared memoryというのを使うと速くなるらしい、が未検証

使用上の注意

  • vimだと勝手にハイライトしてくれた。
  • コンパイラはnvcc。普通のC++ compiler
    • よほど変なことをしない限り平気。
  • ただよほど変なことをするとおかしくなるらしいのでso/dylibにして呼ぶのがよいのかも。
  • doubleは基本使わない。
    • 浮動小数リテラルは「0.0f」みたくしないとワーニングがでる。うざい。
  • CUT_DEVICE_INITマクロは呼ばなくていい。EXITも多分呼ばなくていい。cudaFreeはきちんと呼びましょう

二次元の波動をつくってみた

  • 一次元は軽すぎてprocessingでも余裕だったので…。
  • CPUだと重くて無理
    • まあULV C2Dですし。
  • CUDAでdylibをつくりopenframeworksで呼ぶ。
    • JNI経由でprocessing使おうとしたらなんか重かったのでやめた




.
最終更新:2011年12月19日 17:16