2016-09-21 1 views
0

Je rencontre un comportement étrange lors de la mesure du temps d'exécution d'un noyau OpenCL. Le noyau attend trois tampons en entrée. Je crée ces tampons dans le code hôte et les initialise en utilisant CL_MEM_COPY_HOST_PTR. Je mesure ensuite le temps d'exécution du noyau via les événements OpenCL. Cependant, lorsque j'omets CL_MEM_COPY_HOST_PTR, le temps d'exécution du noyau tombe à un tiers. Jusqu'à présent, j'ai découvert que ce problème avait quelque chose à voir avec les optimisations effectuées par le compilateur OpenCL. Il semble que le compilateur remarque que les tampons ne sont pas initialisés et optimise le noyau en conséquence. Si je fournis l'indicateur "-cl-opt-disable", il n'y a pas de différence de temps d'exécution entre l'initialisation et l'initialisation des tampons. Mais désactiver toutes les optimisations n'est évidemment pas ce que j'ai l'intention de faire.Le temps d'exécution du noyau diminue lorsque vous n'initialisez pas les tampons

Existe-t-il un moyen d'empêcher le compilateur de remarquer que les tampons n'ont pas été initialisés sans désactiver toutes les optimisations? Ecrire juste un octet dans la mémoire tampon n'a malheureusement pas suffi.

Merci d'avance!

+0

Utilisez-vous clenqueuewrite ou clenqueuemap? Peut-être que vous faites une copie supplémentaire avec ceux-ci? –

+0

Donc, vous essayez de microbenchmark quelque chose, et vous voulez que le compilateur ne pas optimiser le noyau différemment? Donc, vous pouvez le tester sans le goulot d'étranglement potentiel de la copie de la mémoire de l'hôte vers le GPU? Êtes-vous sûr que ce n'est pas déjà ce qui se passe? c'est-à-dire peut-être que c'est plus rapide parce que la mémoire reste juste cachée sur le GPU? (Cela n'a peut-être pas de sens, je ne connais pas vraiment OpenCL, surtout l'optimisation et le fonctionnement du matériel en général). –

Répondre

1

CL_MEM_COPY_HOST_PTR force le pilote CL à effectuer une copie de votre mémoire vers le périphérique. Par conséquent, toute autre exécution de noyau qui dépend de ces données pour la lecture sera bloquée jusqu'à la fin de l'opération de copie.

Les temps d'exécution du noyau (tels que rapportés par le profilage CL) seront sûrement les mêmes dans les deux cas. Cependant, si vous ne faites que mesurer du côté de l'unité centrale (ne faites jamais cela!), Vous verrez l'augmentation du temps d'exécution, même si le noyau n'est pas réellement en cours d'exécution mais en attente d'une opération de copie. En désactivant les optimisations, le temps du noyau peut avoir un impact plus important que la copie, ce qui l'occulte dans la mesure.

REMARQUE: Vous pouvez essayer d'autres choses.

  • Définissez votre noyau « write_only » ou votre tampon CL à « WRITE_ONLY », qui devrait faire fonctionner le noyau instantanément, même si le tampon est pas prêt.
  • Mettez un sleep() après la création du tampon
  • Exécutez 2 fois le noyau et mesurez le second.