OpenCLで複雑なアルゴリズムを実装していますが、NVidiaハードウェアの問題に直面しています。私のアルゴリズムが複数回並列に呼び出されると、NVidia GPU上のメモリが不足し、ランダムスレッドの実行がMemoryAllocationエラーで停止する可能性があります(これはhttps://devtalk.nvidia.com/default/topic/1019997/cuda-programming-and-performance/how-to-handle-cl_mem_object_allocation_failure-errors-if-amount-of-useable-memory-is-not-known-/でこれを説明しようとしました)。OpenCL:Nvidia Graphicsハードウェアで使用可能なメモリを読み込みます(OpenGL Extension ?, Cuda Runtime?)
私の現在の解決策は、 GPU上で利用可能なメモリと十分な場合にのみ実行を許可します。問題は利用可能なメモリを読み出すことです。
私はOpenGLのコンテキストで非表示のウィンドウを作成しているため、メモリの読み出しを#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049
glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX,
¤tlyAvailableMemoryInKb);
を使用
。問題は、NVidia gpuがメインのGPUではない場合、gpuアフィニティ拡張を使用してカードを選択する必要があります:https://www.khronos.org/registry/OpenGL/extensions/NV/WGL_NV_gpu_affinity.txtしかし、wglGetProcAddressはnullを返します。これはIntelのGPUをメインデバイスとして起動しているためだと思います。 (wglCreatePbufferARBのような他の拡張機能の読み込みは問題ありません)
これを処理し、別のGPU /ドライバにwglGetProcAddress呼び出しを転送する方法はありますか?
ありがとうございます! 最高のご協力ありがとうございます マイケル
私はまた、使用可能なメモリを取得するために、cudaランタイムを使用してみました。これはうまくいかなかった。 openclドライバが信頼できず(いくつかのcudart機能を使用した後にデッドロックが発生しました)、戻り値が正しくありませんでした。