5

GPUに cl_mem バッファーを割り当てて作業していますが、これは特定のサイズを超えるまで正常に動作します。その場合、割り当て自体は成功しますが、実行またはコピーは成功しません。より高速な操作のためにデバイスのメモリを使用したいので、次のように割り当てます。

buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);

今私が理解していないのはサイズ制限です。約 16M バイトをコピーしていますが、約 128M バイトを使用できるはずです (「参考文献」を参照CL_DEVICE_MAX_MEM_ALLOC_SIZE)。

これらの数値が大きく異なるのはなぜですか?


以下は、oclDeviceQuery からの抜粋です。

 CL_PLATFORM_NAME:  NVIDIA
 CL_PLATFORM_VERSION:  OpenCL 1.0 
 OpenCL SDK Version:  4788711

  CL_DEVICE_NAME:          GeForce 8600 GTS
  CL_DEVICE_TYPE:          CL_DEVICE_TYPE_GPU
  CL_DEVICE_ADDRESS_BITS:              32
  CL_DEVICE_MAX_MEM_ALLOC_SIZE:  128 MByte
  CL_DEVICE_GLOBAL_MEM_SIZE:     255 MByte
  CL_DEVICE_LOCAL_MEM_TYPE:      local
  CL_DEVICE_LOCAL_MEM_SIZE:      16 KByte
  CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:  64 KByte
4

2 に答える 2

3

clCreateBuffer は、実際にはデバイス上にバッファーを作成しません。ドライバーは、作成時にどのデバイスがバッファーを使用するかを認識していないため、これは理にかなっています (1 つのコンテキストが複数のデバイスを持つことができることを思い出してください)。バッファは、書き込みをキューに入れるとき、またはバッファをパラメータとして受け取るカーネルを起動するときに、実際のデバイス上に作成されます。

16MB の制限についてですが、最新のドライバー (195.xx) を使用していますか? その場合は、フォーラムまたは直接 NVIDIA に連絡してください。

于 2009-11-25T16:01:40.343 に答える
2

デバイスで使用したことがある他のメモリを忘れないでください (これがグラフィック カードでもある場合は、ディスプレイが使用しているメモリ)。

(現在利用可能なメモリ、または最大のフラグメントなどを取得する方法はありますか?)

于 2009-12-11T14:41:29.370 に答える