query: tag:opencl

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

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

まだリリースされて間もないせいか、
NVIDIAのOpenCL SDKを使っていると不可解なエラーに遭遇します。
掲題のようなエラーメッセージを出すのもその一例ですが、
以下のようなコード(一部抜粋)でエラーがでます。

c>>
float4 x = sphere->c;
dg->t = x.x;
<<--

しかし以下のように記述すると大丈夫です。

c>>
float x = sphere->c.x;
dg->t = x;
<<--

OpenCLコンパイラが生成したptxコードの中に'selp'というのが入るような場合に問題が発生するようです。

NVIDIAのOpenCL SDKの場合、*.clファイルをCLコンパイラがコンパイルして、ptxという中間言語に変換します。さらに、ptxをptxparse(PLANGというパッケージの一部らしい)が解析してllvmのbcに変換します。
このケースでは、CLコンパイラが吐き出すコードと、ptxparse側の認識が一致していない感じです。
とりあえず、バグが直るまでコンパイラの気持ちになって回避するしかありません。

posted by genki genki on Mon 1 Feb 2010 at 13:00 with 1 comment

NVidiaのOpenCL SDKには、少なくともkernel moduleとdriver component
の二つの要素があるらしい。

pre>>
Error: API mismatch: the NVIDIA kernel module has version 190.18,
but this NVIDIA driver component has version 185.18.08. Please make
sure that the kernel module and all NVIDIA driver components
have the same version.
<<--

たまにこんなエラーメッセージが出てきます。

kernel moduleというのはバージョン番号とファイル名の一致からすると

pre>>
/usr/lib64/libcuda.so.190.18
<<--

このへんのファイルらしい(Linux版)
driver componentというのはどこにある何を指しているのかが不明。

posted by genki genki on Mon 1 Feb 2010 at 05:06 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

OpenCLのエラーコードのメモです。

c>>
// Error Codes
#define CL_SUCCESS 0
#define CL_DEVICE_NOT_FOUND -1
#define CL_DEVICE_NOT_AVAILABLE -2
#define CL_COMPILER_NOT_AVAILABLE -3
#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4
#define CL_OUT_OF_RESOURCES -5
#define CL_OUT_OF_HOST_MEMORY -6
#define CL_PROFILING_INFO_NOT_AVAILABLE -7
#define CL_MEM_COPY_OVERLAP -8
#define CL_IMAGE_FORMAT_MISMATCH -9
#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10
#define CL_BUILD_PROGRAM_FAILURE -11
#define CL_MAP_FAILURE -12

#define CL_INVALID_VALUE -30
#define CL_INVALID_DEVICE_TYPE -31
#define CL_INVALID_PLATFORM -32
#define CL_INVALID_DEVICE -33
#define CL_INVALID_CONTEXT -34
#define CL_INVALID_QUEUE_PROPERTIES -35
#define CL_INVALID_COMMAND_QUEUE -36
#define CL_INVALID_HOST_PTR -37
#define CL_INVALID_MEM_OBJECT -38
#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39
#define CL_INVALID_IMAGE_SIZE -40
#define CL_INVALID_SAMPLER -41
#define CL_INVALID_BINARY -42
#define CL_INVALID_BUILD_OPTIONS -43
#define CL_INVALID_PROGRAM -44
#define CL_INVALID_PROGRAM_EXECUTABLE -45
#define CL_INVALID_KERNEL_NAME -46
#define CL_INVALID_KERNEL_DEFINITION -47
#define CL_INVALID_KERNEL -48
#define CL_INVALID_ARG_INDEX -49
#define CL_INVALID_ARG_VALUE -50
#define CL_INVALID_ARG_SIZE -51
#define CL_INVALID_KERNEL_ARGS -52
#define CL_INVALID_WORK_DIMENSION -53
#define CL_INVALID_WORK_GROUP_SIZE -54
#define CL_INVALID_WORK_ITEM_SIZE -55
#define CL_INVALID_GLOBAL_OFFSET -56
#define CL_INVALID_EVENT_WAIT_LIST -57
#define CL_INVALID_EVENT -58
#define CL_INVALID_OPERATION -59
#define CL_INVALID_GL_OBJECT -60
#define CL_INVALID_BUFFER_SIZE -61
#define CL_INVALID_MIP_LEVEL -62
#define CL_INVALID_GLOBAL_WORK_SIZE -63
<<--

posted by genki genki on Sat 24 Oct 2009 at 15:53 with 0 comments