2

OpenCL カーネルで__constant修飾子を使用できません。私のプラットフォームは Snow Leopard です。

GPU で CL 読み取り専用メモリ オブジェクトを初期化し、定数配列をホストからそれにコピーしようとしました。次に、カーネル引数を__globalメモリ引数と同じように設定しましたが、これは正常に機能しませんが、エラーや警告は表示されません。また、 float型やint型と同様に clSetKernelArg 関数でデータを直接使用しようとしましたが、どちらも機能しません。

何か間違いを犯したり、Apple の実装に何か問題があるのでしょうか? OpenCL (gpu) とホスト コードの両方で、これがどのように行われるかの実例を見たいと思います。

4

3 に答える 3

4

Apple の実装に根本的な問題があるとは思えません。次のOpenCL Hello World サンプルアプリケーションを使用して、基本を理解しました。

この例では、 を に置き換えたところ、__global float* input問題__constant float* inputなく動作しました。CL_MEM_READ_ONLYのようなものを使用して 、バッファが であることも確認する必要がありますclCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL)

仕様を読むと、__constant => __global + CL_MEM_READ_ONLY だと思います。

MBP 15" で Snow Leopard を実行しています。

于 2009-10-22T22:35:20.380 に答える
3

「仕様を読んだことから、私は__constant => __global+CL_MEM_READ_ONLYだと思います。」

実際には、__ globalではなく_constantを指定すると、このデータをメモリの別の部分に保存するようにデバイスに指示します。一部のデバイスでは、同じである可能性がありますが、そうでないデバイスもあります。たとえば、NVIDIAカードでは、64kbの_constantメモリと__global用のmbのロードしかありません。__constantsの利点は、NVIDIAデバイスではキャッシュされることです:)

デバイスにクエリを実行できます:(デバイスクエリの例)

CL_DEVICE_MAX_MEM_ALLOC_SIZE:128メガバイト

CL_DEVICE_GLOBAL_MEM_SIZE:255メガバイト

CL_DEVICE_LOCAL_MEM_SIZE:16Kバイト

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:64Kバイト

于 2010-05-21T14:43:06.143 に答える
3

__constantApple の OpenCL コンパイラがGPU 上の変数を処理する方法には、いくつかのバグがあります。コンパイラのログに次のようなメッセージが表示される場合

OpenCL Build Error : Compiler build log:
Error while compiling the ptx module: CLH_ERROR_NO_BINARY_FOR_GPU
PTX Info log: 
PTX Error log: 

その後、あなたと同じエラーが発生し、バグを報告しました。Apple の人々はそれを (明らかに rdar://7217974 の) 重複としてマークしたので、これは既知の問題であり、彼らはそれに取り組んでいると思います。

于 2009-10-28T08:23:58.027 に答える