web-dev-qa-db-fra.com

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

Je me demandais s'il était possible d'utiliser OpenCL pour Android, j'ai découvert que ce n'était pas possible et j'ai abandonné le sujet. Mais grâce au billet de blog du 14 janvier sur le blog officiel Android Developer (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 a pas mal de fonctionnalités communes avec OpenCL.

Ce que je me demande maintenant, c'est: pourquoi Google a-t-il choisi de mettre en œuvre cette nouvelle solution, au lieu de faire avancer OpenCL (une spécification ouverte désormais gérée par le groupe Khronos).

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

Quoi qu'il en soit, si quelqu'un comme véritable explication, faites-le moi savoir!

43
Redwarp

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

OpenCL utilise le modèle d'exécution introduit pour la première fois dans CUDA. Dans ce modèle, un noyau est composé d'un ou de plusieurs groupes de travailleurs, et chaque groupe a une mémoire partagée rapide et des primitives de synchronisation au sein de ce groupe. Cela entraîne la confusion entre la description d'un algorithme et 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 voulez des performances de pointe absolues, mais cela obtient des performances de pointe au détriment de la portabilité des performances. Peut-être que sur votre architecture, vous avez suffisamment de registres et de mémoire partagée pour exécuter 256 travailleurs par groupe pour de meilleures performances, mais sur une autre architecture, vous vous retrouveriez avec des déversements de registres massifs avec plus de 128 travailleurs par groupe, provoquant une régression des performances de 80% . Pendant ce temps, parce que votre code est écrit explicitement pour 256 travailleurs par groupe, le runtime ne peut rien faire pour essayer d'améliorer la situation sur une autre architecture - il doit obéir à ce que vous avez écrit. Ce type de situation est courant lors du passage d'une architecture à une autre du côté bureau/HPC du calcul GPU.

Sur mobile, Android a besoin d'une portabilité des performances entre de nombreux fournisseurs de GPU et de CPU différents avec des architectures très différentes. Si Android devait s'appuyer sur un modèle d'exécution de style CUDA, il serait presque impossible d'écrire un seul noyau et de le faire fonctionner de manière acceptable sur une gamme de périphériques.

RenderScript résume le contrôle sur la planification loin du développeur au prix de performances de pointe; cependant, nous réduisons constamment l'écart en termes de ce qui est possible avec RenderScript. Par exemple, ScriptGroup, une API introduite dans Android 4.2, est une grande partie de nos plans pour améliorer encore la génération de code GPU. De nombreuses nouvelles améliorations sont à venir qui rendent l'écriture de code rapide encore plus facile, aussi.

32
Tim Murray

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

Nous avons travaillé sur OpenCL avec Android ( voir ici ) et sommes heureux de le voir progresser grâce au travail d'Intel, d'Imagination et d'autres fabricants de puces. . Google fera demi-tour assez tôt.

44
arrayfire