2017-09-27 8 views
0

Je suis en train de mettre en œuvre un algorithme complexe dans OpenCL mais je suis confronté à un problème sur le matériel NVidia. Lorsque mon algorithme est appelé plusieurs fois dans la mémoire parallèle sur le GPU NVidia ne suffit pas et l'exécution de threads aléatoires pourraient arrêter des erreurs de MemoryAllocation (j'ai essayé d'expliquer cela sur 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-/ avant.)OpenCL: lecture de la mémoire disponible sur le matériel graphique Nvidia (extension OpenGL, Cuda Runtime?)

Ma solution actuelle est de demander la mémoire disponible sur le GPU et n'autoriser l'exécution que s'il y en a assez. Le problème est la lecture de la mémoire disponible.

J'utilise

#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049 
glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX, 
    &currentlyAvailableMemoryInKb); 

pour lire la mémoire pour laquelle je crée une fenêtre masquée avec un contexte OpenGL. Le problème est maintenant que lorsque le GPU NVidia n'est pas le GPU principal, je dois sélectionner la carte en utilisant l'extension d'affinité gpu: https://www.khronos.org/registry/OpenGL/extensions/NV/WGL_NV_gpu_affinity.txt mais wglGetProcAddress renvoie null. Je pense que c'est parce que je démarre avec le GPU Intel comme périphérique principal. (Le chargement d'autres extensions comme wglCreatePbufferARB n'est pas un problème.)

Y a-t-il un moyen de gérer cela et de transférer l'appel wglGetProcAddress à un autre GPU/pilote?

Merci d'avance! Meilleures salutations Michael

Ps .: J'ai également essayé d'utiliser le cuda runtime pour obtenir la mémoire disponible. Cela n'a pas fonctionné. Le pilote opencl n'était pas fiable (provoquait des interblocages après l'utilisation de certaines fonctions de cudart) et la valeur renvoyée était incorrecte.

Répondre

1

J'ai trouvé une autre solution. Je ne connaissais pas NVAPI auparavant, mais cette bibliothèque a résolu le problème.

J'utilise OpenCL pour obtenir l'ID PCI de la carte NVidia sélectionnée:

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

Puis-je utiliser NvAPI_EnumPhysicalGPUs pour énumérer les GPUs nvidia. Avec NvAPI_GPU_GetBusId je peux obtenir l'ID de bus pci des périphériques retournés par la fonction précédente. Si les ID de bus sont égaux, j'appelle NvAPI_GPU_GetMemoryInfo pour obtenir la quantité de mémoire actuellement disponible. Jusqu'à présent, cela résout tous les problèmes que j'avais. Ce qui signifie que je peux laisser tomber opengl et le hack laid pour ouvrir une fenêtre invisible.