Renderscript

Renderscript

Renderscript Renderscript Boris Mansencal 23/03/2018 2019-11-08 Renderscript Boris Mansencal 23/03/2018 Boris Mansencal Renderscript 23/03/2018 1 / 22 Renderscript Renderscript Renderscript Renderscript est un syst`emequi permet d'executer des calculs de fa¸con performante (parall´elis´ee)assez simplement. Il est particuli`erementadapt´eaux CPUs et GPUs multicoeurs, et notamment pour le traitement d'images. https://developer.android.com/guide/topics/renderscript/ Renderscript compute.html 2019-11-08 On peut se passer de RenderScript pour ´ecriredu code tr`esperformant. On peut utiliser le NDK (Native Development Kit) qui permet d'utiliser Renderscript est un syst`emequi permet d'executer des calculs de fa¸con du code C/C++. Mais c'est beaucoup plus compliqu´e: il faut g´erersoit performante (parall´elis´ee)assez simplement. m^emele fait qu'on peut avoir diff´erentesconfigurations hardware (CPU, Il est particuli`erementadapt´eaux CPUs et GPUs multicoeurs, et GPU, nb coeurs, ARM v5/v7, x86, ...) ; g´ereraussi les synchronisations, ... notamment pour le traitement d'images. RenderScript a ´et´ed´evelopp´epour simplifier tout cela. Les diff´erencesmat´eriellessont compl`etement cach´ees.Le d´eveloppeur https://developer.android.com/guide/topics/renderscript/ n'´ecritqu'une version du code. compute.html Le code RenderScript sera en fait compil´e,`ala vol´ee,`al'ex´ecution de l'application, sur le smartphone. Dans les premi`eresversions d'Android (< 4.1 / API level 16), il y avait une partie Graphique (en plus de cette partie Calcul). Mais elle a ´et´eabandonn´ee. Nous vous encourageons fortement `alire la documentation Android sur Renderscript. Cette pr´esentationn'en est qu'une version ´edulcor´ee. Boris Mansencal Renderscript 23/03/2018 2 / 22 Renderscript Renderscript Renderscript RenderScript fait r´ef´erence`adeux choses : Un langage (d´eriv´edu C99) utilis´epour ´ecriredes noyaux. Une API de contr^olequi permet de g´ererles ressources et noyaux RenderScript. Renderscript 2019-11-08 Pour un code utilisant du Renderscript, il va donc y avoir deux parties : une partie en langage proche proche du C99, une partie en langage haut RenderScript fait r´ef´erence`adeux choses : niveau (Java pour nous). Cette API de contr^oleest disponible en Java, C++ et dans le script lui- Un langage (d´eriv´edu C99) utilis´epour ´ecriredes noyaux. m^eme Une API de contr^olequi permet de g´ererles ressources et noyaux RenderScript. Boris Mansencal Renderscript 23/03/2018 3 / 22 Renderscript : configuration Renderscript Pour utiliser RenderScript, il faut le pr´eciserdans le build.gradle du r´epertoire app. Dans la section defaultConfig, rajouter les lignes : Renderscript : configuration renderscriptTargetApi 18 renderscriptSupportModeEnabled true Renderscript n´ecessite Android 2.3 (API level 9). Pour utiliser RenderScript, il faut le pr´eciserdans le build.gradle du Renderscript : configuration r´epertoire app. 2019-11-08 Dans la section defaultConfig, rajouter les lignes : renderscriptTargetApi : la valeur est entre 11 et le dernier API level dispo- renderscriptTargetApi 18 renderscriptSupportModeEnabled true nible (27 pour Oreo/8.x.0, 28 pour Android P/9.0, 29 pour Android10/10). Ici, on dit qu'il faut au minimum Android 2.3 (API level 9), mais cela Renderscript n´ecessite Android 2.3 (API level 9). d´epend en fait de ce qui est import´e.On en parle plus loin. Boris Mansencal Renderscript 23/03/2018 4 / 22 Renderscript Renderscript : kernel Le noyau ou kernel d´efinitune ou plusieurs fonctions qui vont s'ex´ecuter Renderscript : kernel de fa¸conparall`elesur des donn´ees(Allocations). Il y a deux types de noyaux : noyau de correspondance ou mapping kernel (ou foreach kernel): s'applique individuellement sur chaque ´elementd'une ou plusieurs Allocations (de m^emesdimensions) et produit une Allocation en sortie. noyau de r´eductionou reduction kernel : s'applique individuellement Renderscript : kernel sur chaque ´elementd'une ou plusieurs Allocations (de m^emes dimensions) et produit une seule valeur en sortie. [Android 7.0 (API level 24)] 2019-11-08 Le noyau ou kernel d´efinitune ou plusieurs fonctions qui vont s'ex´ecuter de fa¸conparall`elesur des donn´ees(Allocations). • Allocation : c'est en gros un buffer qui stocke un type donn´e. Il y a deux types de noyaux : • Mapping kernel : c'est typiquement ce qu'on va utiliser en noyau de correspondance ou mapping kernel (ou foreach kernel): traitement d'image. Les donn´eesd'entr´eesont nos pixels, et on va s'applique individuellement sur chaque ´elementd'une ou plusieurs appliquer un noyau sur chaque pixel, individuellement et Allocations (de m^emesdimensions) et produit une Allocation en ind´ependamment des autres pixels, pour produire de nouveaux sortie. pixels. noyau de r´eductionou reduction kernel : s'applique individuellement • Reduction kernel : on peut par exemple s'en servir pour calculer la sur chaque ´elementd'une ou plusieurs Allocations (de m^emes somme des ´el´ementsde l'Allocation d'entr´ee. dimensions) et produit une seule valeur en sortie. [Android 7.0 (API Pour ces TDs, nous allons nous int´eresseraux mapping kernels. level 24)] Boris Mansencal Renderscript 23/03/2018 5 / 22 Renderscript : kernel Renderscript : kernel Renderscript Concr`etement,un noyau est ´ecritdans un fichier .rs. Ces fichiers sont g´en´eralementdans un r´epertoire rs. Sous Android studio, click droit sur napp puis New ! Folder ! RenderScript Folder Renderscript : kernel 2019-11-08 Le r´epertoire apparait comme renderscript sous Android Studio mais s'ap- pelle bien rs sur le disque. Il va ^etreici : app/src/main/rs Concr`etement,un noyau est ´ecritdans un fichier .rs. Ces fichiers sont g´en´eralementdans un r´epertoire rs. Sous Android studio, click droit sur napp puis New ! Folder ! RenderScript Folder Boris Mansencal Renderscript 23/03/2018 6 / 22 Renderscript : kernel Renderscript Un exemple de script : invert.rs #pragma version(1) Renderscript : kernel #pragma rs java_package_name(com.android.rssample) uchar4 RS_KERNEL invert(uchar4 in, uint32_t x, uint32_t y) { uchar4 out = in; out.r = 255 - in.r; out.g = 255 - in.g; out.b = 255 - in.b; return out; Un exemple de script : invert.rs Renderscript : kernel } #pragma version(1) 2019-11-08 #pragma rs java_package_name(com.android.rssample) Langage proche du C99. Ce noyau va ^etrecompil´epar le compilateur RenderScript, sur uchar4 RS_KERNEL invert(uchar4 in, uint32_t x, uint32_t y) { le smartphone cible. [C'est aussi ce qui se passe pour les shaders graphiques (en OpenGL par exemple)]. • version(1) : c'est actuellement la seule version valable. uchar4 out = in; • com.android.rssample doit ^etreremplac´epar le package name de votre projet. out.r = 255 - in.r; • La fonction kernel appelable depuis Java est d´ecor´eepar RS KERNEL out.g = 255 - in.g; • Cette fonction ne concerne qu'un seul ´el´ementde la ou les Allocations d'entr´ee out.b = 255 - in.b; et va s'appliquer en parall`elepour chaque ´el´ement pour remplir l'Allocation de sortie. Dans notre cas, si notre Allocation contient les pixels d'une image, la fonction va s'appliquer en return out; parall`elesur cheque pixel. Elle prend les valeurs pour un pixel en entr´ee,et produit les valeurs pour un pixel } en sortie. On ne se pr´eoccupe pas du parcours des buffers/Allocations, ni de la parall´elisation.C'est fait pour nous. • on voit apparaitre le type uchar4 : struct en C99, qui contient 4 uchar, nomm´es r, g, b, et a. Jusqu'`amaintenant, en Java, nos couleurs ´etaitstock´eescomme des ints et on acc´edait aux uchars. • on a acc`es`ala position du pixel (x, y) mais on ne s'en sert pas ici. On aurait pu l'omettre. • Ce script est tr`essimple. On peut aussi avoir des variables globales ou des fonctions auxiliaires (appel´ees invokable functions, et non d´ecor´ees par Boris Mansencal Renderscript 23/03/2018 7 / 22 RS KERNEL). Renderscript : kernel Renderscript Un exemple de script : invert.rs #pragma version(1) Renderscript : kernel #pragma rs java_package_name(com.android.rssample) uchar4 RS_KERNEL invert(uchar4 in, uint32_t x, uint32_t y) { uchar4 out = in; out.r = 255 - in.r; out.g = 255 - in.g; out.b = 255 - in.b; return out; Un exemple de script : invert.rs Renderscript : kernel } Est-ce que vous avez une id´eede comment faire toGray() ? #pragma version(1) 2019-11-08 #pragma rs java_package_name(com.android.rssample) uchar4 RS_KERNEL invert(uchar4 in, uint32_t x, uint32_t y) { • Il faut passer par des \int" ou des “floats”. uchar4 out = in; out.r = 255 - in.r; out.g = 255 - in.g; out.b = 255 - in.b; return out; } Est-ce que vous avez une id´eede comment faire toGray() ? Boris Mansencal Renderscript 23/03/2018 8 / 22 Renderscript : kernel Renderscript Un exemple de script : gray.rs #pragma version(1) Renderscript : kernel #pragma rs java_package_name(com.android.rssample) uchar4 RS_KERNEL toGray(uchar4 in) { float4 pixelf = rsUnpackColor8888(in); float gray = (0.30*pixelf.r + 0.59*pixelf.g + 0.11*pixelf.b); Un exemple de script : gray.rs return rsPackColorTo8888(gray, gray, gray, pixelf.a); Renderscript : kernel } #pragma version(1) 2019-11-08 #pragma rs java_package_name(com.android.rssample) uchar4 RS_KERNEL toGray(uchar4 in) { • On voit apparaitre le type float4 : struct en C99, qui contient 4 floats, nomm´esr, g, b, et a. float4 pixelf = rsUnpackColor8888(in); • rsUnpackColor8888 transforme les canaux uchar (dans [0 ; 255]) en floats dans [0 ;1] float gray = (0.30*pixelf.r + 0.59*pixelf.g • rsPackColorTo8888 transforme les canaux floats dans [0 ; 1] en + 0.11*pixelf.b); uchar (dans [0 ; 255]). • On aurait aussi pu utiliser

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    22 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us