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?

OpenCL et CUDA sont complètement différents. Ils utilisent tous les deux le même HW à la fin. Mais, tout comme OpenGL et DirectX, on est pas sous l'autre ou vice-versa. Principaux points à l'état de ce que les bibliothèques sont différents, les compilateurs sont différents, et le modèle d'exécution est différente. Certains éléments sont susceptibles de l'être commun, mais la majorité ne l'est pas.
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