Cuda ist meines Erachtens klar besser - vor allem von der Programmierbarkeit- sofern man auf die Offenheit verzichten kann.
Denn OpenCL trennt den GPU-Code und den Host(CPU)-Code logisch stark von einander, wodurch sich die Kommunikation und die Verschachtelung zwischen komplexeren GPU-Programmen und Host-Programmen äußerst schwierig gestaltet. Bei CUDA sind, sofern man C bzw das CPP-Interface bzw. die Runtime-API verwendet, beide Programme logisch gesehen relativ stark verschmolzen. So kann man in CUDA meist problemlos die selben Datenstrukturen und Funktionen sowohl auf der GPU als auch auf der CPU verwenden, was einem die Arbeit oft stark vereinfacht. All dies ist in OpenCL nicht oder nur extrem umständlich möglich. Erschwerend kommt hinzu, dass CPP gegenüber C diverse Vorteile bietet, wobei ersteres nur von CUDA für GPU-Programme unterstützt wird.
Diverse Goodies die in CUDA noch anfallen sind, dass man bei NVIDA GPUs in CUDA mehr Features als in OpenCL verwenden kann, man Pointer Support in CUDA statts den Buffer Support in OpenCL hat, und dass in CUDA die Hardware besser spezifiziert ist. Letzteres kann man oft für mächtige Optimierungen nutzen. Teilweise kann man die Hardwareeigenschaften zwar auch in OpenCL abfragen, aber wichtige Eigenschaften sind eben nicht abfragbar, wodurch man solche Optimierungen auch nur schlecht allgemein durchführen kann.
Deshalb würde ich insgesamt für NVIDIA GPUs immer CUDA verwenden und mich sogar sofern möglich bewusst auf NVIDIA GPUs einschränken. So hätte ich Teile meiner Masterarbeit die ich gerade mit CUDA schreibe in OpenCL nicht so gut hinbekommen. Meines Erachtens nach ist das insgesamt auch der Grund weshalb AMD auf dem GPGPU-Sektor nur schlecht Fuss fassen kann. Man schaue sich nur größere GPGPU-Projekte oder wissenschaftliche Paper an: Die allermeisten solcher Arbeiten, vor allem diejenigen die über "ich schreibe eben einen parallelen Algorithmus in OpenCL und lasse ihn auf ner GPU laufen" hinausgehen und sich explizit damit beschäftigen "ich habe einen parallelen Algorithmus und will ihn so modifizieren, dass er möglichst gut auf einer GPU läuft" sind fast immer in CUDA geschrieben. So habe ich in meiner Literaturrecherche für meine Masterarbeit auch relativ viele CUDA-Paper zu meinem Thema gefunden, aber kein einziges OpenCL Paper.