Pourquoi Google a-t-il choisi RenderScript au lieu d’OpenCL

Je me demandais s’il était possible d’utiliser OpenCL pour Android, de découvrir que ce n’était pas possible et d’abandonner complètement le sujet. Mais grâce au blog du 14 janvier sur le blog officiel des développeurs Android (http://android-developers.blogspot.fr/2013/01/evolution-of-renderscript-performance.html), j’ai découvert que la programmation parallèle était possible depuis Android 4.0, grâce à RenderScript! Une API qui possède quelques fonctionnalités communes avec OpenCL.

Ce que je me demande maintenant, c’est: pourquoi Google a-t-il choisi d’implémenter cette nouvelle solution, au lieu de pousser OpenCL vers l’avant (une spécification ouverte gérée par le groupe Khronos).

Je veux dire, je sais, ce n’est pas vraiment difficile de convertir de l’un à l’autre, mais quand même …

Quoi qu’il en soit, si quelqu’un comme la vraie explication, s’il vous plaît faites le moi savoir!

La réponse est que les besoins d’Android sont très différents de ceux qu’OpenCL tente de fournir.

OpenCL utilise le modèle d’exécution introduit en premier dans CUDA. Dans ce modèle, un kernel est constitué d’un ou de plusieurs groupes de travailleurs, et chaque groupe dispose d’une mémoire partagée rapide et de primitives de synchronisation au sein de ce groupe. Cela a pour effet de mélanger la description d’un algorithme avec la façon dont cet algorithme doit être planifié sur une architecture particulière (car vous décidez de la taille d’un groupe et du moment de la synchronisation au sein de ce groupe).

C’est génial lorsque vous écrivez pour une architecture et que vous souhaitez obtenir des performances maximales absolues, mais que les performances sont optimales au désortingment de la portabilité des performances. Peut-être que sur votre architecture, vous disposez de suffisamment de registres et de mémoire partagée pour exécuter 256 employés par groupe pour de meilleures performances, mais sur une autre architecture, vous vous retrouverez avec plus de 128 employés par groupe, entraînant une régression des performances de 80% . Pendant ce temps, comme votre code est écrit explicitement pour 256 employés par groupe, le moteur d’exécution ne peut rien faire pour améliorer la situation sur une autre architecture: il doit obéir à ce que vous avez écrit. Ce type de situation est courant lorsque l’on passe de l’architecture à l’architecture du côté ordinateur / HPC du calcul GPU.

Sur le mobile, Android a besoin de la portabilité des performances entre de nombreux fournisseurs de processeurs graphiques et de processeurs avec des architectures très différentes. Si Android s’appuyait sur un modèle d’exécution de style CUDA, il serait presque impossible d’écrire un kernel unique et de l’exécuter de manière acceptable sur une série de périphériques.

Les résumés de RenderScript contrôlent la planification du développeur au désortingment de certaines performances optimales; Cependant, nous comblons constamment les lacunes en termes de rendu possible avec RenderScript. Par exemple, ScriptGroup, une API introduite dans Android 4.2, constitue une grande partie de nos plans visant à améliorer la génération de code GPU. Il y a beaucoup de nouvelles améliorations à venir qui rendent l’écriture de code encore plus facile.

Apple détient la marque sur OpenCL. Google est en concurrence avec Apple. C’est peut-être aussi simple que cela.

Nous avons travaillé sur OpenCL avec Android ( voir ici ) et nous sums heureux de le voir progresser grâce au travail d’Intel, d’Imagination et d’autres fabricants de puces. Google se retournera assez tôt.