2017-09-30 5 views
-3

Je reçois une erreur 'out of memory' en utilisant l'API cudaMallocPitch avec les GPU GeForce GTX 1080 TI et/ou GeForce GTX 1080 font partie d'un serveur PC complet qui comprend 4 GPU (1 1080 TI et 3 1080) et deux CPU.cudaMallocPitch est échoué alors que plusieurs processeurs GPU sont contrôlés par des processus CPU séparés malgré le fait qu'il y ait suffisamment de mémoire

Chaque GPU est contrôlé par un thread CPU dédié qui appelle cudaSetDevice avec le bon index de périphérique au début de son exécution.

Selon les informations d'un fichier de configuration, l'application sait combien de threads de CPU doivent être créés.

Je peux aussi exécuter mon application plusieurs fois en tant que processus séparés que chacun contrôlera différents GPU. J'utilise OpenCV version 3.2 pour effectuer une soustraction d'arrière-plan d'image. Tout d'abord, vous devez créer l'objet BackgroundSubtractorMOG2 en utilisant cette méthode: cv :: cuda :: createBackgroundSubtractorMOG2 et ensuite vous devez appeler sa méthode apply.

La première méthode d'application est appelée toute la mémoire nécessaire est alocalisée une fois.

La taille de l'image est 10000 cols et 7096 lignes. Chaque pixel est 1B (Niveaux de gris). Quand je lance mon application en un seul processus qui a plusieurs threads (chacun pour chaque GPU) tout fonctionne bien mais quand je l'exécute 4 fois en tant que processus séparés (chacun pour chaque GPU) la fonction d'application OpenCV commence échouer en raison de l'échec cudaMallocPitch «pas assez de mémoire».

Pour tous les GPU, j'ai vérifié que j'avais suffisamment de mémoire disponible avant que l'application ne soit activée pour la première fois. Pour 1080 il est rapporté que j'ai ~ 5.5GB et pour le 1080 TI j'ai ~ 8.3GB et la taille demandée est: largeur - 120000bytes, taille - 21288bytes - ~ 2.4GB.

Veuillez nous aviser.

+0

En quoi cette question est-elle différente de vous? – talonmies

+0

Cette question est mon vrai problème. Dans le cadre de son enquête, j'ai essayé de le reproduire avec une logique plus simple qui est représentée par la question précédente. Par erreur, je n'ai pas vu que c'était totalement OK. Donc, après avoir réalisé que mon test était OK, j'ai décidé de poser une question sur mon vrai problème. – OronG

+1

Alors, vous souhaitez que nous vous aidions à déboguer vos mots? Comment pourrait-on dire ce qui pourrait mal se passer sans voir le code en question? – talonmies

Répondre

-1

La source de problème a été trouvé:

API cudaMallocPitch valeur renvoyée est cudaErrorMemoryAllocation en raison du fait qu'il n'y avait pas disponible OS mémoire virtuelle qui utilisé par le système d'exploitation lorsque exécute lecture le processus \ accès en écriture à la physique GPU Mémoire. Pour cette raison, le pilote CUDA échoue à toute sorte d'allocation de mémoire physique GPU.

La complexité ici était de comprendre pourquoi cette API est en panne alors que suffisamment de mémoire physique GPU existe (vérifié par l'API cudaMemGetInfo).

j'ai commencé à analyser deux points:

  1. Pourquoi je n'ai pas assez de mémoire virtuelle dans mon PC? En effectuant les instructions de liaison suivant j'ai changé sa taille et le problème a été disparu: https://www.online-tech-tips.com/computer-tips/simple-ways-to-increase-your-computers-performace-configuring-the-paging-file/

  2. Pourquoi mon processus consomment beaucoup de mémoire virtuelle OS?Dans le passé, je me suis rendu compte que pour avoir une meilleure performance pendant le temps de traitement, je ne dois allouer qu'une seule fois toutes les mémoires physiques GPU nécessaires, car une opération d'allocation prend beaucoup de temps. Étant donné que je travaille avec une résolution d'environ 70 Mo et que mes logiques de traitement nécessitaient une grande quantité de tampons auxiliaires, il fallait allouer une énorme surface GPU et CPU pour vider les zones disponibles de la mémoire virtuelle du système d'exploitation.