2010-11-05 70 views
2

En OpenCL, j'ai un noyau qui doit fonctionner sur des données complexes et réelles. Je pourrais mettre une instruction conditionnelle dans ce qui appelle la bonne ligne de code pour gérer ceci, ou je pourrais avoir deux noyaux que j'appelle et pousser l'instruction conditionnelle sur mon code appelant.Dois-je créer plusieurs noyaux OpenCL pour éviter les instructions conditionnelles?

Ceci est évidemment mauvais pour la maintenabilité, mais est-ce important pour la performance?

Répondre

2

Si c'est juste une instruction conditionnelle, dans mon expérience, la différence de performance est absolument négligeable, au moins sur le matériel NVidia.

Fondamentalement, tant que tous (ou la plupart) des work-items suivent le même chemin de code, tout va bien. Comme le chemin de code pris dépend d'un argument noyau dans votre cas, tous les éléments de travail suivent le même chemin.

1

Dépend légèrement de l'emplacement du conditionnel. Code pour la lisibilité d'abord, puis les performances après que vous l'avez mesuré ET constaté que c'est un problème

par exemple. kernel_for_RGB_image et kernel_for_ABGR_image semble être une utilisation raisonnable, des noyaux différents pour dérouler efficacement une boucle interne profonde pourraient être un problème de maintenance plus important.

0

Je pense que le meilleur moyen est d'essayer et de comparer deux variantes. Dans certains cas, la compilation de plusieurs blocs conditionnels, même si un seul d'entre eux est exécuté, peut entraîner des performances moins bonnes. La raison en est GPRs (registres à usage général): le compilateur alloue autant de registres que nécessaire pour le cas le plus défavorable.

je peux proposer une telle solution: une seule fonction du noyau, mais avec la compilation conditionnelle:

__kernel void work() 
{ 
#if VAR 
    // one code 
#else 
    // another code 
#endif 
} 

Ensuite, vous devez recompiler le noyau avec true/false ensemble à VAR lors du changement de condition. Evidemment, pour le compilateur il ne diffère pas de deux noyaux, mais pour le maintien peut être meilleur, si une partie du code est la même pour ces noyaux.