CUDA vs OpenCL comparaison des performances
Je suis en utilisant CUDA 6.0 et l'OpenCL mise en œuvre qui est livré avec le CUDA SDK. J'ai deux noyaux identiques pour chaque plate-forme (ils diffèrent dans la plate-forme de mots-clés spécifiques). Ils seulement lire et écrire la mémoire globale, chaque thread emplacement différent. La configuration de lancement pour CUDA est 200 blocks of 250 threads (1D)
, qui correspond directement à la configuration de la prise en charge d'OpenCL - 50,000 global work size and 250 local work size
.
L'OpenCL code s'exécute plus rapidement. Est-ce possible ou suis-je le calendrier de mal? Ma compréhension est que la NVIDIA OpenCL mise en œuvre est basée sur la une pour CUDA. Je reçois environ 15% de meilleures performances avec OpenCL.
Il serait grand si vous pourriez suggérer pourquoi je suis peut-être voir cela et peut-être quelques différences entre CUDA et OpenCL, mis en place par NVIDIA?
Si vous êtes sur une plate-forme 64 bits, ma première hypothèse serait que l'OpenCL noyau bénéficient du registre inférieur de la pression, car il peut être 32 bits. Si l'OpenCL de la chaîne de permis, vous devez décompiler les deux et de comparer le microcode.
NVIDIA OpenCL mise en œuvre est de 32 bits et ne se conforme pas à la même fonction d'appel d'exigences de CUDA. CUDA runtime applications de compiler le code du noyau d'avoir le même nombre de bits que l'application. Sur une plate-forme 64 bits essayez de compiler le CUDA application comme une application 32 bits. Votre utilisation de la double n'a rien à voir avec le nombre de bits de l'application ou du code du noyau. Il est possible d'obtenir le PTX code à partir d'un OpenCL noyau de sorte que vous pouvez comparer le code CUDA. À ce moment, vous ne pouvez pas obtenir le SASS code OpenCL noyaux.
Numériques sont des réponses que vous obtenez avec OpenCL et CUDA identiques? Si non, alors les grains ne sont pas les mêmes calculs.
Je sais que cette question est déjà un an et je suis probablement en soulignant ce qui est évident, mais dans le cas où vous êtes à l'aide de CUDA runtime api, méfiez-vous que CUDA a pour initialiser le pilote avant l'exécution de votre code du noyau, ce qui peut fausser votre timings par rapport à OpenCL... Essayez d'exécuter certains mannequin d'itérations de votre noyau avant de faire les timings
OriginalL'auteur user1096294 | 2014-05-06
Vous devez vous connecter pour publier un commentaire.
Les noyaux de l'exécution sur un GPU moderne sont presque jamais de calcul lié, et qui sont presque toujours bande passante de la mémoire lié. (Car il y a tellement de cœurs de calcul de course par rapport au chemin d'accès à la mémoire).
Cela signifie que le rendement d'un noyau dépend en grande partie sur l'accès à la mémoire de motifs exposés par l'algorithme donné.
Dans la pratique, ce qui rend très difficile de prédire (ou même de comprendre) ce que les performances à attendre à l'avance.
Les différences observées sont probablement dues à des différences subtiles dans la mémoire des schémas d'accès entre les deux noyaux qui sont le résultat de différentes optimisations apportées par l'OpenCL vs CUDA de la chaîne d'.
Pour apprendre comment optimiser votre GPU noyaux qu'il paie pour apprendre les détails de la mémoire cache du matériel disponible pour vous, et comment l'utiliser pour en tirer le meilleur profit. (par exemple, la stratégie d'utilisation des "locale" de la mémoire caches vs toujours aller directement à la section "global" de la mémoire en OpenCL.)
OriginalL'auteur Shebla Tsama