あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

2015年10月

OpenGLのディスプレイリスト、頂点配列、VBOを比較します。

まず、3手法に共通するのは、glVertexなどのAPI呼び出しを減らすことで処理を高速化している点です。
その上で、3手法には下表に示すような特徴があります。
無題
メモリ転送負荷は、CPU→GPUのメモリ転送にかかる時間を表しています。
データ変更可能性は、後から頂点データの変更が可能か否かを表しています。
両方に丸がついているVBOを使うのが良いと思われますが、一応全部説明します。

・ディスプレイリスト
glVertexなどの命令をGPU上のメモリにまとめて格納してから呼び出すことで、API呼び出しとメモリ転送の負荷を減らします。
ただし、後から頂点データの変更はできません。
http://seesaawiki.jp/w/mikk_ni3_92/d/%a5%c7%a5%a3%a5%b9%a5%d7%a5%ec%a5%a4%a5%ea%a5%b9%a5%c8

・頂点配列(Vertex Array)
頂点データを配列として用意し、1回のAPI呼び出しでまとめて描画することでAPI呼び出しの負荷を減らします。
後から頂点データを変更することができますが、描画の度にCPU→GPUのメモリ転送が発生します。
使い方は、
1. 頂点配列の用意
2. 配列の指定(glVertexPointer)
3. 配列の描画(glDrawArrays, glDrawElements)
http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?OpenGL%20-%20Vertex%20array

・VBO(Vertex Buffer Object)
上記頂点配列をGPU側のメモリにあるバッファに格納して処理を行う。描画の度にCPU→GPUのメモリ転送が発生しない。
使い方は、
1. 頂点配列の用意
2. バッファの生成(glGenBuffers)
3. バッファ転送(glBufferData)
4. 配列の指定(glVertexPointer)
5. 配列の描画(glDrawArrays, glDrawElements)
※glVertexPointerの引数の意味が、上記頂点配列とは異なるので注意。
http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?OpenGL%20-%20VBO


CUDAプログラムの最小構成とそれをVIsualStudioでコンパイルする際の注意点を示します。

ソースコードは以下の通り。ファイル名は仮にSource.cuとします。
以下のページのソースコードを一部変更したものです。
http://seesaawiki.jp/w/mikk_ni3_92/d/CUDA%ca%d402

無題
注意点は以下の通り。

・ビルドカスタマイズ
コンソールアプリケーションテンプレートから作る場合はビルドカスタマイズが必要です。
ソリューションエクスプローラーでプロジェクトを右クリック > ビルド依存関係 > ビルドのカスタマイズをクリック。
CUDA(.targets, .props)にチェックを入れます。

・ビルドツールの選択
ソリューションエクスプローラーでSource.cuを右クリック > プロパティをクリック。
構成プロパティ > 全般 > 項目の種類をCUDA C/C++に変更します。

・cutil.h問題
古いCUDAでよく使われていたcutil.hが新しいCUDAには入っていません。
CUDA SDKをmakeするとその中に入ってるとか、CudaSamplesに入っているhelper_cuda.hを代わりに使うとか色々方法はあるようですが、どうもスマートじゃない。
Toolkitに入っているcuda_runtime.hやdevice_launch_parameters.hで代用するのが正攻法かと思います。
http://saito-175.hatenablog.com/entry/2013/07/25/191519

・コンパイルできるけどエラーの赤線が出る問題
__syncthreads()などに赤線が引かれてしまう問題です。
__CUDACC__マクロをdefineすると赤線が出なくなるようですが、インテリセンスが効かなくなるので辛い。
今のところ根本的な解決策が見つかっていません。
http://www.momo86.net/amahodo/contents/cuda/entry002

↑このページのトップヘ