Question

Dans OpenCL, j'ai un noyau qui doit fonctionner sur des données complexes et réelles. Je pourrais mettre une déclaration conditionnelle en appelant la ligne droite de code pour gérer cela, ou je pourrais avoir deux noyaux que j'appelle et pousser l'instruction conditionnelle à mon code d'appel.

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

Était-ce utile?

La solution

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

En fait, tant que tous (ou la plupart) travail-éléments suivent le même chemin de code, vous allez bien. Comme le chemin de code pris dépend un argument du noyau dans votre cas, tous les travaux-éléments suivent le même chemin.

Autres conseils

dépend peu de l'endroit où le conditionnel est. Code pour la lisibilité d'abord, puis les performances après avoir mesura et a constaté que c'est un problème

par exemple. kernel_for_RGB_image et kernel_for_ABGR_image semble comme une utilisation raisonnable, différents noyaux pour efficacement déroulez une boucle intérieure profonde peut-être un plus grand mal de tête d'entretien.

Je pense que la meilleure façon est d'essayer réellement et deux variantes de référence. Dans certains cas, ayant plusieurs blocs conditionnels compilés, même si un seul d'entre eux est exécuté, peut conduire à une dégradation des performances. La raison est GPR (registres à usage général):. Le compilateur alloue autant de registres, qui sont nécessaires pour le pire des cas

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 l'ensemble true / false à VAR lors du changement de condition. De toute évidence, pour le compilateur, il ne diffère pas de deux noyaux, mais pour maintenir peut-être mieux, si une partie du code est le même pour les noyaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top