Présentation
La fonction rsForEvery() peut être utilisée pour appeler le noyau racine d'un script.
Les autres fonctions permettent d'obtenir les caractéristiques de l'appel d'un noyau en cours d'exécution, telles que les dimensions et les index actuels. Ces fonctions utilisent rs_kernel_context comme argument.
Résumé
Types | |
---|---|
rs_for_each_strategy_t | Ordre suggéré pour le traitement des cellules |
rs_kernel | Gérer une fonction de noyau |
rs_kernel_context | Gérer un contexte d'appel du noyau |
rs_script_call_t | Informations sur l'itération des cellules |
Fonctions | |
---|---|
rsForChaque | Lance un noyau |
rsForEveryInternal | (API interne) Lancer un noyau dans le script actuel (avec le numéro d'emplacement) |
rsForEveryWithOptions | Lance un noyau avec des options |
rsGetArray0 | Index dans la dimension Array0 pour le contexte de noyau spécifié |
rsGetArray1 | Index dans la dimension Array1 pour le contexte de noyau spécifié |
rsGetArray2 | Index dans la dimension Array2 pour le contexte de noyau spécifié |
rsGetArray3 | Index dans la dimension Array3 pour le contexte de noyau spécifié |
rsGetDimArray0 | Taille de la dimension Array0 pour le contexte de noyau spécifié |
rsGetDimArray1 | Taille de la dimension Array1 pour le contexte de noyau spécifié |
rsGetDimArray2 | Taille de la dimension Array2 pour le contexte de noyau spécifié |
rsGetDimArray3 | Taille de la dimension Array3 pour le contexte de noyau spécifié |
rsGetDimHasFaces | Présence de plusieurs visages pour le contexte de noyau spécifié |
rsGetDimLod | Nombre de niveaux de détail pour le contexte de noyau spécifié |
rsGetDimX | Taille de la dimension X pour le contexte de noyau spécifié |
RSGetDimY | Taille de la dimension Y pour le contexte de noyau spécifié |
rsGetDimZ | Taille de la dimension Z pour le contexte de noyau spécifié |
rsGetFace | Coordonnées du visage pour le contexte du noyau spécifié |
rsGetLod | Index dans la dimension Niveaux de détail pour le contexte de noyau spécifié |
Types
rs_for_each_strategy_t : suggestion d'ordre de traitement sur le réseau mobile
Énumération avec les valeurs suivantes:
RS_FOR_EACH_STRATEGY_SERIAL = 0 | Choisissez des régions de mémoire contiguës. |
---|---|
RS_FOR_EACH_STRATEGY_DONT_CARE = 1 | Aucune préférence. |
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2 | Je préfère l'heure d'été. |
RS_FOR_EACH_STRATEGY_TILE_Small = 3 | Privilégiez le traitement de petites régions rectangulaires. |
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4 | Privilégier les régions rectangulaires moyennes. |
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5 | Privilégiez le traitement sur de grandes régions rectangulaires. |
Ce type est utilisé pour suggérer la manière dont le noyau appelé doit itérer sur les cellules des allocations. Ceci n'est qu'un indice. Les implémentations peuvent ne pas suivre la suggestion.
Cette spécification peut faciliter le comportement de mise en cache du noyau en cours d'exécution, par exemple la localité du cache lorsque le traitement est réparti sur plusieurs cœurs.
rs_kernel : gestion d'une fonction de noyau
Définition de type: void* Attribut ajouté au niveau d'API 24.
Type opaque pour une fonction définie avec l'attribut de noyau. Une valeur de ce type peut être utilisée dans un appel rsForEvery pour lancer un noyau.
rs_kernel_context : gestion d'un contexte d'appel du noyau
Définition de type: const struct rs_kernel_context_t * Attribut ajouté au niveau d'API 23.
Le contexte du noyau contient des caractéristiques communes aux allocations itérées, telles que les dimensions. Il contient également des index rarement utilisés de la cellule en cours de traitement, comme l'indice Array0 ou le niveau de détail actuel.
Vous pouvez accéder au contexte du noyau en ajoutant un paramètre spécial nommé "context" de type rs_kernel_context à votre fonction de noyau. Consultez rsGetDimX() et rsGetArray0() pour obtenir des exemples.
rs_script_call_t : informations sur l'itération des cellules
Une structure comportant les champs suivants:
Stratégie rs_for_each_strategy_t | Actuellement ignoré. À l'avenir, nous suggérerons la stratégie d'itération de cellules. |
---|---|
uint32_t xStart | Index de départ dans la dimension X |
uint32_t xEnd | Index de fin (exclusif) dans la dimension X |
uint32_t yStart | Index de départ dans la dimension Y. |
uint32_t yEnd | Index de fin (exclusif) dans la dimension Y |
uint32_t zStart | Index de départ dans la dimension Z. |
uint32_t zEnd | Index de fin (exclusif) dans la dimension Z. |
uint32_t arrayStart | Index de départ dans la dimension "Tableau" |
uint32_t arrayEnd | Index de fin (exclusif) dans la dimension "Array0" (Tableau0). |
uint32_t array1Start | Index de départ dans la dimension "Tableau" |
uint32_t tableau1Fin | Index de fin (exclusif) dans la dimension "Tableau1". |
uint32_t array2Start | Index de départ dans la dimension "Tableau2". |
uint32_t tableau2Fin | Index de fin (exclusif) dans la dimension "Tableau2". |
uint32_t array3Start | Index de départ dans la dimension "Tableau" |
uint32_t tableau3Fin | Index de fin (exclusif) dans la dimension "Array3" (Tableau3). |
Cette structure est utilisée pour fournir des informations d'itération à un appel rsForEvery. Il est actuellement utilisé pour restreindre le traitement à un sous-ensemble de cellules. Dans les futures versions, elle servira également à fournir des indications sur la meilleure façon d'itérer les cellules.
Les champs Début sont inclus et les champs Fin sont exclusifs. Par exemple, pour itérer sur les cellules 4, 5, 6 et 7 de la dimension X, définissez xStart sur 4 et xEnd sur 8.
Fonctions
rsForEvery : lance un noyau
void rsForEvery(rs_kernel kernel, ... ...); | Ajouté au niveau d'API 24 |
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation); | Niveau d'API 14 à 23 |
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData); | Supprimé du niveau d'API 14 ou supérieur |
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData, const rs_script_call_t* sc); | Supprimé du niveau d'API 14 ou supérieur |
void rsForeach(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData, size_t usrDataLen); | Niveau d'API 14 à 20 |
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); | Niveau d'API 14 à 20 |
Paramètres
script | Script à appeler. |
---|---|
entrée | Allocation à partir de laquelle les données sources sont utilisées. |
output | Allocation dans laquelle écrire la date. |
usrData | Données définies par l'utilisateur à transmettre au script. Peut être NULL. |
sc | Informations de contrôle supplémentaires permettant de sélectionner une sous-région de l'allocation à traiter ou de suggérer une stratégie de marche. Peut être NULL. |
usrDataLen | Taille de la structure userData. Ceci sera utilisé pour effectuer une copie superficielle des données si nécessaire. |
noyau | de la fonction à une fonction définie avec l'attribut du noyau. |
... | Allocations d'entrée et de sortie |
Exécute le noyau sur zéro ou plusieurs allocations d'entrées. Elles sont transmises après l'argument rs_kernel. Si le noyau spécifié renvoie une valeur, une allocation de sortie doit être spécifiée en tant que dernier argument. Toutes les allocations d'entrée et l'allocation en sortie, le cas échéant, doivent avoir les mêmes dimensions.
Il s'agit d'une fonction synchrone. Un appel à cette fonction n'est renvoyé qu'une fois que tout le travail est terminé pour toutes les cellules des allocations d'entrée. Si la fonction du noyau renvoie une valeur, l'appel attend que tous les résultats aient été écrits dans l'allocation de sortie.
Jusqu'au niveau d'API 23, le noyau est implicitement spécifié en tant que noyau nommé "root" dans le script spécifié, et une seule allocation d'entrée peut être utilisée. À partir du niveau d'API 24, une fonction de noyau arbitraire peut être utilisée, comme spécifié par l'argument du noyau. L'argument de script est supprimé. Le noyau doit être défini dans le script actuel. En outre, plusieurs entrées peuvent être utilisées.
Exemple :
float __attribute__((kernel)) square(float a) {
return a * a;
}
void compute(rs_allocation ain, rs_allocation aout) {
rsForEach(square, ain, aout);
}
rsForEveryInternal (API interne) : lance un noyau dans le script actuel (avec le numéro d'emplacement)
void rsForeachInternal(int_slot, rs_script_call_t* options, int hasOutput, int numInputs, rs_allocation* allocs); | Ajouté au niveau d'API 24 |
Paramètres
créneau | |
---|---|
options | |
hasOutput | Indique si le noyau génère une sortie |
Nombre d'entrées | Nombre d'allocations d'entrées |
allocations | Allocations d'entrée et de sortie |
API interne permettant de lancer un noyau.
rsForEveryWithOptions : lance un noyau avec des options
void rsForEveryWithOptions(rs_kernel kernel, rs_script_call_t* options, ... ...); | Ajouté au niveau d'API 24 |
Paramètres
noyau | de la fonction à une fonction définie avec l'attribut du noyau. |
---|---|
options | Options de lancement |
... | Allocations d'entrée et de sortie |
Lance le noyau d'une manière semblable à rsForEvery. Toutefois, au lieu de traiter toutes les cellules de l'entrée, cette fonction ne traite que les cellules situées dans le sous-espace de l'espace d'index spécifié dans les options. L'espace d'index étant explicitement spécifié par les options, aucune allocation d'entrée ou de sortie n'est requise pour le lancement d'un noyau à l'aide de cette API. Si des allocations sont transmises, elles doivent correspondre au nombre d'arguments et à la valeur de retour attendus par la fonction de noyau. L'allocation en sortie n'est présente que si et seulement si le noyau possède une valeur renvoyée non nulle.
Exemple :
rs_script_call_t opts = {0};
opts.xStart = 0;
opts.xEnd = dimX;
opts.yStart = 0;
opts.yEnd = dimY / 2;
rsForEachWithOptions(foo, &opts, out, out);
rsGetArray0 : index dans la dimension Array0 pour le contexte de noyau spécifié
uint32_t rsGetArray0(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie l'index dans la dimension Array0 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni.
Le contexte du noyau contient les caractéristiques communes des allocations itérées et des index rarement utilisés, tels que l'index Array0.
Vous pouvez accéder au contexte du noyau en ajoutant un paramètre spécial nommé "context" de type rs_kernel_context à votre fonction de noyau. Exemple :
short RS_KERNEL myKernel(short value, uint32_t x, rs_kernel_context context) {
// The current index in the common x, y, z dimensions are accessed by
// adding these variables as arguments. For the more rarely used indices
// to the other dimensions, extract them from the kernel context:
uint32_t index_a0 = rsGetArray0(context);
//...
}
Cette fonction renvoie 0 si la dimension "Array0" n'est pas présente.
rsGetArray1 : index dans la dimension Array1 pour le contexte de noyau spécifié
uint32_t rsGetArray1(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie l'index dans la dimension Array1 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array1" n'est pas présente.
rsGetArray2 : index dans la dimension "Array2" pour le contexte de noyau spécifié
uint32_t rsGetArray2(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie l'index dans la dimension Array2 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array2" n'est pas présente.
rsGetArray3 : index dans la dimension "Array3" pour le contexte de noyau spécifié
uint32_t rsGetArray3(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie l'index dans la dimension Array3 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array3" n'est pas présente.
rsGetDimArray0 : taille de la dimension "Array0" pour le contexte de noyau spécifié
uint32_t rsGetDimArray0(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension Array0 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array0" n'est pas présente.
rsGetDimArray1 : taille de la dimension "Array1" pour le contexte de noyau spécifié
uint32_t rsGetDimArray1(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension Array1 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array1" n'est pas présente.
rsGetDimArray2 : taille de la dimension "Array2" pour le contexte de noyau spécifié
uint32_t rsGetDimArray2(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension Array2 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array2" n'est pas présente.
rsGetDimArray3 : taille de la dimension "Array3" pour le contexte de noyau spécifié
uint32_t rsGetDimArray3(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension Array3 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si la dimension "Array3" n'est pas présente.
rsGetDimHasFaces : présence de plusieurs visages pour le contexte de noyau spécifié
bool rsGetDimHasFaces(context rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie
Renvoie la valeur "true" si plusieurs visages sont présents et la valeur "false" dans le cas contraire. |
Si le noyau effectue une itération sur un plan cube, cette fonction renvoie la valeur "true" si plusieurs faces sont présentes. Dans tous les autres cas, la valeur renvoyée est "false". Consultez rsGetDimX() pour obtenir une explication du contexte.
rsAllocationGetDimFaces() est similaire, mais renvoie 0 ou 1 au lieu d'une valeur booléenne.
rsGetDimLod : nombre de niveaux de détail pour le contexte de noyau spécifié
uint32_t rsGetDimLod(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie le nombre de niveaux de détail pour le contexte de noyau spécifié. C'est utile pour les mipmaps. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si le niveau de détail n'est pas utilisé.
rsAllocationGetDimLOD() est similaire, mais renvoie 0 ou 1 au lieu du nombre réel de niveaux.
rsGetDimX : taille de la dimension X pour le contexte de noyau spécifié
uint32_t rsGetDimX(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension X pour le contexte de noyau spécifié.
Le contexte du noyau contient les caractéristiques communes des allocations itérées et des index rarement utilisés, tels que l'index Array0.
Vous pouvez y accéder en ajoutant un paramètre spécial nommé "context" de type rs_kernel_context à votre fonction de noyau. Exemple :
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
uint32_t size = rsGetDimX(context); //...
Pour obtenir la dimension d'allocation spécifique, utilisez rsAllocationGetDimX().
rsGetDimY : taille de la dimension Y pour le contexte de noyau spécifié
uint32_t rsGetDimY(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension X pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si la dimension Y n'est pas présente.
Pour obtenir la dimension d'allocation spécifique, utilisez rsAllocationGetDimY().
rsGetDimZ : taille de la dimension Z pour le contexte de noyau spécifié
uint32_t rsGetDimZ(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la taille de la dimension Z pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.
Renvoie 0 si la dimension Z n'est pas présente.
Pour obtenir la dimension d'allocation spécifique, utilisez rsAllocationGetDimZ().
rsGetFace : coordonnée du visage pour le contexte du noyau spécifié
rs_allocation_cubemap_face rsGetFace(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie la face sur laquelle la cellule en cours de traitement est trouvée, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.
Renvoie RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X si la dimension du visage n'est pas présente.
rsGetLod : indice dans la dimension "Niveaux de détail" pour le contexte de noyau spécifié
uint32_t rsGetLod(contexte rs_kernel_context); | Ajouté au niveau d'API 23 |
Renvoie l'index dans la dimension "Niveaux de détail" de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.
Renvoie 0 si la dimension Niveaux de détail n'est pas présente.