Wäre ganz gut wenn es mal wieder Neuerungen im GPU Computing gibt. Gerade da ist Nvidia AMD ja weit unterlegen (gewesen).
Ist eigentlich anders herum. Vom Featureset ist NVIDIA AMD seit Jahren weit voraus.
Die Vorteile letzterer Lösung haben nach einigen Gesprächen mit den Gruppenmitgliedern schnell überwogen, da a) die Portabilität wesentlich höher ist und b) auch Probleme, die ggf. in der eingeschränkten Verwendbarkeit von CUDA liegen, nicht behoben werden können.
Dies sind m.E. die einzigen beiden Vorteile von OpenCL. Allerdings kommen dafür viele Nachteile unter anderem:
-Trennung von Hostcode und Kernelcode . Dadurch hat man meist unnötig Redundanzen drinnen, muss ich Gedanken um das Alignment machen und umständlich Textdateien einlesen. In CUDA wird das eben vermieden, dass man beides in ein und die selbe Datei schreibt, und es dem NVCC dann rausziehen lässt.
-Nur OpenCL C, während CUDA C/CPP Code kann.
-Viele CUDA-Features von NVIDIA-Karten werden in OpenCL nicht unterstützt, bzw. OpenCL häng den Features von CUDA Jahre hinterher (zB. Warpvotefunctions, malloc innerhalb eines Kernels, Rekursion, Dynamic Parallelism).
-Pointer Support in CUDA, während man in OpenCL im Prinzip auf Bufferobjekte zugreift. (Mit OpenCL 2.0 wird das allerdings auch aufgeweicht).
-OpenCL-Compile interpretieren die OpenCL-Spezifikationen sehr freizügig. Generell war es für mich immer ganz amüsant meine Kernels durch die OpenCL-Compiler von Intel, AMD und NVIDIA laufen zu lassen, und zu sehen wie jeder andere Fehler gefunden hat oder auch hin und wieder komplett abgestürtzt ist.
-Ungenaue Hardwarespezifikation in OpenCL, wobei man nur ein paar wenige der potentiell wichtigen Hardwareeigenschaften abgfagen kann. Vor allem fehlen unter anderem Warps, Register, Occupancy und viele Eigenschaften der Speicherbereiche und wie Zugriffe auf diese abgearbeitet werden. CUDA spezifiziert die Hardware allerdings exakt. Dadurch kann man anhand der CUDA-Spezifikation sehr gut optimieren, während man in OpenCL entweder auf die CUDA-Spezifikation oder auf die AMD-GPU-Spezifikationen zurückgreifen muss, wenn man optimieren will.
So habe ich auch zuerst angefangen GPGPU per OpenCL zu programmieren. Doch dann bin bekam ich zunehmed zu spüren, dass man bei GPGPU, wegen ihrer Einfachheit, stärker auf die spezifische Hardware optimieren muss, wenn man eine gute Performance besitzen möchte (und aus akademischer Sicht: Denn man sich schon GPGPU auf die Fahnen schreibt, dann macht es m.E. keinen Sinn wenn man lediglich eine For Schleife in einem Algorithmus auf der GPU 1:1 parallelisiert). So begann ich mit der Optimierung des Codes auf die gewünschte Ziel-GPU, eine Fermi-GPU, gemäss der CUDA-Spezifikation. Da diese Optimierungen dann dazu führten, dass der Code auf anderen Devices gar nicht mehr lauffähig war, hatte ich von der Portabilität nun nichts mehr - dem einzigen Vorteil von OpenCL- dafür traten die oben genannten Nachteile auf. So bin ich dann letztendlich zum Schluss gekommen, dass es sich empfiehlt CUDA zu programmieren, wenn man keine Portabilität wünscht und das Programm auf NVIDIA-GPUs lauffähig sein soll.