2017-09-27 6 views
0

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, 
    &currentlyAvailableMemoryInKb); 

を使用

。問題は、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機能を使用した後にデッドロックが発生しました)、戻り値が正しくありませんでした。

答えて

1

別の解決策が見つかりました。これまでNVAPIについてはわかりませんでしたが、このライブラリはこの問題を解決しました。

私が選択したNVidiaのカードのPCI IDを取得するためにOpenCLを使用します。

#define CL_DEVICE_PCI_BUS_ID_NV 0x4008 
cl_int busId = 0; 
device.getInfo(CL_DEVICE_PCI_BUS_ID_NV, &busId); 

は、それから私は、NVIDIAのGPUのを列挙するためにNvAPI_EnumPhysicalGPUsを使用しています。 NvAPI_GPU_GetBusIdを使用すると、前の関数から返されたデバイスのpciバスIDを取得できます。バスIDが等しい場合は、現在使用可能なメモリ量を取得するためにNvAPI_GPU_GetMemoryInfoを呼び出します。

これまでのところ、これは私が持っていたすべての問題を解決します。意味私は、見えないウィンドウを開くためにopenglと醜いハックを落とすことができます。

関連する問題