query: tag:cuda

CUDA 3.0がリリースされましたが、今回からOpenCL SDKも同梱されて /Developer/GPU Computing/OpenCL にインストールされるようになりました。

CUDA ("C"ディレクトリの中身)はmakeでsampleが普通にビルドできたのですが、OpenCLの方は以下のようなエラーが出ます。

pre>>
src/oclUtils.cpp: In function ‘void oclPrintDevInfo(int, _cl_device_id*)’:
src/oclUtils.cpp:282: error: ‘CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV’ was not declared in this scope
src/oclUtils.cpp:283: error: ‘CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV’ was not declared in this scope
src/oclUtils.cpp:290: error: ‘CL_DEVICE_REGISTERS_PER_BLOCK_NV’ was not declared in this scope
src/oclUtils.cpp:294: error: ‘CL_DEVICE_WARP_SIZE_NV’ was not declared in this scope
src/oclUtils.cpp:298: error: ‘CL_DEVICE_GPU_OVERLAP_NV’ was not declared in this scope
src/oclUtils.cpp:302: error: ‘CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV’ was not declared in this scope
src/oclUtils.cpp:306: error: ‘CL_DEVICE_INTEGRATED_MEMORY_NV’ was not declared in this scope
make: *** [obj/release/oclUtils.cpp.o] Error 1
<<--

これらの定数はSDK同梱のcommon/inc/cl_ext.h の中で定義されているのですが、どうやら
/System/Library/Frameworks/OpenCL.framework/Headers の方を参照してしまっているようで、こちらには定数が定義されていないようです。

posted by genki genki on Fri 2 Apr 2010 at 04:10 with 0 comments

CUDA kernelの引数で渡せるデータのサイズは sizeof(void*)*16 が上限で、それを超えるとエラー701(Launch exceeded resources)が発生します。

回避するためには、値渡しをしているものをメモリオブジェクト経由で渡すようにするか、そもそもメモリオブジェクトを17個以上使っている場合は、デバイスアドレスのポインタの構造体を用意し、その構造体をメモリオブジェクト経由で渡すと良いようです。

一方、OpenCLにはkernel引数のサイズに制約がないので使い易いです。
OpenCLのkernelで気を付けるべき点としては、kernel引数をfloat3* で受けると、cpuデバイスでは動くものが、gpuデバイスの場合おかしな挙動をするようになったりするので、避けた方が良さそうです。

posted by genki genki on Mon 22 Mar 2010 at 16:13 with 0 comments

CUresultの値一覧表です。

pre>>
CUDA_SUCCESS = 0, ///< No errors
CUDA_ERROR_INVALID_VALUE = 1, ///< Invalid value
CUDA_ERROR_OUT_OF_MEMORY = 2, ///< Out of memory
CUDA_ERROR_NOT_INITIALIZED = 3, ///< Driver not initialized
CUDA_ERROR_DEINITIALIZED = 4, ///< Driver deinitialized

CUDA_ERROR_NO_DEVICE = 100, ///< No CUDA-capable device available
CUDA_ERROR_INVALID_DEVICE = 101, ///< Invalid device
CUDA_ERROR_INVALID_IMAGE = 200, ///< Invalid kernel image
CUDA_ERROR_INVALID_CONTEXT = 201, ///< Invalid context
CUDA_ERROR_CONTEXT_ALREADY_CURRENT = 202, ///< Context already current
CUDA_ERROR_MAP_FAILED = 205, ///< Map failed
CUDA_ERROR_UNMAP_FAILED = 206, ///< Unmap failed
CUDA_ERROR_ARRAY_IS_MAPPED = 207, ///< Array is mapped
CUDA_ERROR_ALREADY_MAPPED = 208, ///< Already mapped
CUDA_ERROR_NO_BINARY_FOR_GPU = 209, ///< No binary for GPU
CUDA_ERROR_ALREADY_ACQUIRED = 210, ///< Already acquired
CUDA_ERROR_NOT_MAPPED = 211, ///< Not mapped
CUDA_ERROR_INVALID_SOURCE = 300, ///< Invalid source
CUDA_ERROR_FILE_NOT_FOUND = 301, ///< File not found

CUDA_ERROR_INVALID_HANDLE = 400, ///< Invalid handle

CUDA_ERROR_NOT_FOUND = 500, ///< Not found

CUDA_ERROR_NOT_READY = 600, ///< CUDA not ready

CUDA_ERROR_LAUNCH_FAILED = 700, ///< Launch failed
CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES = 701, ///< Launch exceeded resources
CUDA_ERROR_LAUNCH_TIMEOUT = 702, ///< Launch exceeded timeout
CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING = 703, ///< Launch with incompatible texturing

CUDA_ERROR_UNKNOWN = 999 ///< Unknown error
<<--

posted by genki genki on Sun 7 Feb 2010 at 22:06 with 0 comments

Linux環境でNVIDIAのCUDA/OpenCLを使う場合、以下のような環境変数の設定に注意する必要がある。

pre>>
NV_COMPUTE_SDK_PATH="/path/to/NVIDIA_GPU_Computing_SDK"
SDK_INSTALL_PATH="/path/to/NVIDIA_GPU_Computing_SDK/C"
<<--

posted by genki genki on Sun 7 Feb 2010 at 09:12 with 0 comments

優れた点もいっぱいありますが、欠点を並べてみます。

CUDA

  • NVidia依存
  • 1回のkernel実行で同一テクスチャへのread/writeができない

OpenCL

  • まだバグが多い
  • 1回のkernel実行で同一imageオブジェクトへのread/writeができない(少なくともversion 1.0では)

GLSL

  • 実装がWindow systemに依存している。アプリケーションの起動にXが必要になるなど。

GLSLはレンダーターゲットテクスチャを使うことで同一テクスチャへの読み書きができるのが便利。これはテクスチャへの書き込み位置をVertexシェーダを通して指定する必要があるという制約とのトレードオフ。CUDA/OpenCLのようにテクスチャ書き込みにランダムアクセスを許す仕様では実装の困難度が高いので、まだ実現出来ていない。OpenCLの仕様では、__read_write が予約されているので、将来はサポートされるかもしれない。

posted by genki genki on Mon 25 Jan 2010 at 07:02 with 0 comments