2017-09-16 1 views
0

J'utilise le support bêta pour OpenCL 2.0 sur NVIDIA et le ciblage de GPU haut de gamme comme 1080ti. Dans mon pipeline de calcul, je dois parfois envoyer du travail pour traiter de manière indépendante des images relativement petites. En théorie, je pense que ces images devraient pouvoir être traitées en parallèle sur un seul GPU car la quantité de groupes de travail pour une seule image ne va pas saturer toutes les unités de calcul du GPU.OpenCL Parallel Dispatch

  1. Est-ce possible dans OpenCL? Est-ce que cela a un nom dans OpenCL?

  2. Si c'est possible, l'utilisation de plusieurs files d'attente pour un seul périphérique est-elle le seul moyen de le faire? Ou le conducteur va-t-il regarder le "waitEventList" et décider quels noyaux peuvent être traités en parallèle?

  3. Ai-je besoin de CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE?

Répondre

2

1- Oui, c'est l'une des façons d'obtenir un rendement élevé sur l'occupation des unités de calcul. Le nom général peut être "pipelining" (avec l'aide de la mise en file d'attente asynchrone et/ou du parallélisme dynamique). Il y a différentes manières, on fait des lectures sur une file d'attente, en faisant des écritures sur une autre file, en faisant des calculs sur une troisième file avec 3 files d'attente en contrôle avec des évènements d'attente; la deuxième façon pourrait être d'avoir M files d'attente chacune faisant un travail de lecture-calcul-écriture d'une image différente sans événements.

2- Vous pouvez même utiliser une file d'attente unique mais un type hors-norme afin que les noyaux soient distribués indépendamment. Mais au moins pour certaines cartes amd, même une file d'attente dans l'ordre peut optimiser les noyaux indépendants (selon codexl d'amd) avec une exécution simultanée (ceci peut être hors spécifications opencl). Les événements d'attente peuvent être une contrainte pour arrêter ce type d'optimisations côté conducteur (encore une fois, au moins sur amd)

À partir de la version 2.x, il y a une capacité de mise en file d'attente côté périphérique, ce qui vous permet de mettre en file d'attente 1 noyau de l'hôte. Le noyau peut mettre en file d'attente N noyaux, indépendamment de l'intervention de l'hôte (si toutes les données sont déjà téléchargées sur la carte), cela peut ne pas être utilisé comme latence (si des données sont nécessaires entre l'hôte et le périphérique).

3- L'exécution hors service n'est pas forcée sur les fournisseurs, cela peut ne pas fonctionner.

+1

Si vous ne voulez pas avoir à utiliser une file d'attente de commandes en panne, utilisez plutôt plusieurs files d'attente de commandes dans l'ordre. Si votre appareil est capable de traiter plus d'un noyau à la fois, il en prendra un dans chaque file d'attente de commandes. C'est beaucoup plus facile que de traiter des files d'attente en panne. – Dithermaster

+0

Oui, plusieurs files d'attente dans l'ordre ont également des performances prévisibles grâce au contrôle explicite de l'hôte. –