Descripción general
La función rsForEach() se puede usar para invocar el kernel raíz de una secuencia de comandos.
Las otras funciones se usan para obtener las características de la invocación de un kernel en ejecución, como las dimensiones y los índices actuales. Estas funciones toman un rs_kernel_context como argumento.
Resumen
Tipos | |
---|---|
rs_for_each_strategy_t | Orden sugerido de procesamiento de celdas |
rs_kernel | Cómo controlar una función de kernel |
rs_kernel_context | Controla un contexto de invocación de kernel |
rs_script_call_t | Información de iteración de celdas |
Funciones | |
---|---|
rsParacada | Inicia un kernel. |
rsForEachInterno | (API interna) Inicia un kernel en la secuencia de comandos actual (con el número de ranura) |
rsForEachWithOptions | Inicia un kernel con opciones. |
rsGetArray0 | Índice en la dimensión Array0 para el contexto de kernel especificado |
rsGetArray1 | Índice en la dimensión Array1 para el contexto de kernel especificado |
rsGetArray2 | Índice en la dimensión Array2 para el contexto de kernel especificado |
rsGetArray3 | Índice en la dimensión Array3 para el contexto de kernel especificado |
rsGetDimArray0 | Tamaño de la dimensión Array0 para el contexto de kernel especificado |
rsGetDimArray1 | Tamaño de la dimensión Array1 para el contexto de kernel especificado |
rsGetDimArray2 | Tamaño de la dimensión Array2 para el contexto de kernel especificado |
rsGetDimArray3 | Tamaño de la dimensión Array3 para el contexto de kernel especificado |
rsGetDimHasFaces | Presencia de más de una cara para el contexto del kernel especificado |
rsGetDimLod | Cantidad de niveles de detalle para el contexto de kernel especificado |
rsGetDimX | Tamaño de la dimensión X para el contexto de kernel especificado |
rsGetDimY | Tamaño de la dimensión Y para el contexto de kernel especificado |
rsGetDimZ | Tamaño de la dimensión Z para el contexto de kernel especificado |
rsGetFace | Coordenada de la cara para el contexto del kernel especificado |
rsGetLod | Índice en la dimensión Niveles de detalle para el contexto de kernel especificado |
Tipos
rs_for_each_strategy_t : Orden sugerido de procesamiento de celdas
Una enumeración con los siguientes valores:
RS_FOR_EACH_STRATEGY_SERIAL = 0 | Opta por regiones de memoria contiguas. |
---|---|
RS_FOR_EACH_STRATEGY_DONT_CARE = 1 | Sin preferencias. |
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2 | Preferir DST. |
RS_FOR_EACH_STRATEGY_TILE_SMALL = 3 | Opta por procesar regiones rectangulares pequeñas. |
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4 | Opta por procesar regiones rectangulares medianas. |
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5 | Opta por procesar regiones rectangulares grandes. |
Este tipo se usa para sugerir cómo debe iterar el kernel invocado sobre las celdas de las asignaciones. Esta es solo una sugerencia. Es posible que las implementaciones no sigan la sugerencia.
Esta especificación puede ayudar con el comportamiento de almacenamiento en caché del kernel en ejecución, p.ej., la localidad de la caché cuando el procesamiento se distribuye en varios núcleos.
rs_kernel : Control de una función de kernel
Se agregó una typedef de: void* en el nivel de API 24.
Es un tipo opaco de una función que se define con el atributo kernel. Se puede usar un valor de este tipo en una llamada rsForEach para iniciar un kernel.
rs_kernel_context : Control de un contexto de invocación de kernel
Se agregó el typedef de: const struct rs_kernel_context_t * Se agregó en el nivel de API 23.
El contexto del kernel contiene características comunes de las asignaciones sobre las que se iteran, como las dimensiones. También contiene índices de la celda procesada en el momento que se usan con poca frecuencia, como el índice Array0 o el nivel de detalle actual.
Puedes acceder al contexto del kernel si agregas un parámetro especial llamado "context" del tipo rs_kernel_context a la función de tu kernel. Consulta rsGetDimX() y rsGetArray0() para ver ejemplos.
rs_script_call_t : Información de iteración de las celdas
Una estructura con los siguientes campos:
estrategia rs_for_each_strategy_t | Se ignora actualmente. En el futuro, se sugerirá una estrategia de iteración de celdas. |
---|---|
uint32_t xStart | Índice inicial en la dimensión X. |
uint32_t xEnd | Índice final (exclusivo) en la dimensión X. |
uint32_t yStart | Índice inicial en la dimensión Y. |
uint32_t yEnd | Índice final (exclusivo) en la dimensión Y. |
uint32_t zStart | Índice inicial en la dimensión Z. |
uint32_t zEnd | Índice final (exclusivo) en la dimensión Z. |
uint32_t arrayStart | Índice inicial en la dimensión Array0. |
uint32_t ArrayEnd | Índice final (exclusivo) en la dimensión Array0. |
uint32_t array1Inicio | Índice inicial en la dimensión Array1. |
uint32_t arreglo1Fin | Índice final (exclusivo) en la dimensión Array1. |
uint32_t array2Start | Índice inicial en la dimensión Array2. |
uint32_t array2End | Índice final (exclusivo) en la dimensión Array2. |
uint32_t array3Start | Índice inicial en la dimensión Array3. |
uint32_t arreglo3Fi | Índice final (exclusivo) en la dimensión Array3. |
Esta estructura se usa para proporcionar información de iteración a una llamada rsForEach. Actualmente, se usa para restringir el procesamiento a un subconjunto de celdas. En versiones futuras, también se usará para proporcionar sugerencias sobre cómo iterar mejor las celdas.
Los campos Inicio son inclusivos y los campos Fin son exclusivos. P.ej., para iterar sobre las celdas 4, 5, 6 y 7 en la dimensión X, establece xStart en 4 y xEnd en 8.
Funciones
rsForEach : Inicia un kernel
void rsForEach(rs_kernel kernel, ... ...); | Se agregó en el nivel de API 24. |
void rsForEach(rs_script script, entrada rs_allocation, salida rs_allocation); | Nivel de API 14-23 |
void rsForEach(rs_script script, entrada rs_allocation, salida rs_allocation, const void* usrData); | Se quitó del nivel de API 14 y versiones posteriores. |
void rsForEach(rs_script script, entrada rs_allocation, salida rs_allocation, const void* usrData, const rs_script_call_t* sc); | Se quitó del nivel de API 14 y versiones posteriores. |
void rsForEach(rs_script script, entrada rs_allocation, salida rs_allocation, const void* usrData, size_t usrDataLen); | Nivel de API 14-20 |
void rsForEach(rs_script script, rs_allocation entrada, rs_allocation resultado, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); | Nivel de API 14-20 |
Parámetros
secuencia de comandos | Guion para la llamada. |
---|---|
input | Asignación desde los datos de origen. |
output | Asignación en la que se escribirá la fecha. |
usrData | Datos definidos por el usuario para pasar a la secuencia de comandos. Puede ser NULO. |
psc | Información de control adicional que se usa para seleccionar una subregión de la asignación que se procesará o sugerir una estrategia para caminar. Puede ser NULO. |
usrDataLen | Tamaño de la estructura userData. Esto se usará para realizar una copia superficial de los datos, si es necesario. |
memoria | Designador de función para una función que se define con el atributo kernel. |
… | Asignaciones de entrada y salida |
Ejecuta el kernel en cero o más asignaciones de entrada. Se pasan después del argumento rs_kernel. Si el kernel especificado muestra un valor, se debe especificar una asignación de salida como el último argumento. Todas las asignaciones de entrada, y la asignación de salida, si existe, deben tener las mismas dimensiones.
Esta es una función síncrona. Una llamada a esta función solo se muestra después de que se completó todo el trabajo para todas las celdas de las asignaciones de entrada. Si la función de kernel muestra algún valor, la llamada espera hasta que todos los resultados se escriban en la asignación de salida.
Hasta el nivel de API 23, el kernel se especifica de forma implícita como un kernel llamado "raíz" en la secuencia de comandos especificada, y solo se puede usar una asignación de entrada. A partir del nivel de API 24, se puede usar una función de kernel arbitraria, según lo especificado en el argumento del kernel. Se quita el argumento de la secuencia de comandos. El kernel debe definirse en la secuencia de comandos actual. Además, se puede utilizar más de una entrada.
P.ej.,
float __attribute__((kernel)) square(float a) {
return a * a;
}
void compute(rs_allocation ain, rs_allocation aout) {
rsForEach(square, ain, aout);
}
rsForEachInternal : (API interna) Inicia un kernel en la secuencia de comandos actual (con el número de ranura)
void rsForEachInternal(int ranura, rs_script_call_t* opciones, int hasOutput, int numInputs, rs_allocation* allocs); | Se agregó en el nivel de API 24. |
Parámetros
horario disponible | |
---|---|
Opciones | |
hasOutput | Indica si el kernel genera un resultado |
numInputs | Cantidad de asignaciones de entrada |
asignaciones | Asignaciones de entrada y salida |
API interna para iniciar un kernel
rsForEachWithOptions : Inicia un kernel con opciones
void rsForEachWithOptions(rs_kernel kernel, rs_script_call_t* opciones, ... ...); | Se agregó en el nivel de API 24. |
Parámetros
memoria | Designador de función para una función que se define con el atributo kernel. |
---|---|
Opciones | Opciones de lanzamiento |
… | Asignaciones de entrada y salida |
Inicia el kernel de una manera similar a rsForEach. Sin embargo, en lugar de procesar todas las celdas de la entrada, esta función solo procesa las celdas en el subespacio del espacio de índice especificado en las opciones. Con el espacio de índice especificado de forma explícita por las opciones, no se requiere ninguna asignación de entrada o salida para un lanzamiento de kernel mediante esta API. Si se pasan asignaciones, deben coincidir con la cantidad de argumentos y el valor de muestra que espera la función del kernel. La asignación de salida está presente solo si el kernel tiene un valor de retorno no vacío.
P.ej.,
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 : Índice en la dimensión Array0 para el contexto de kernel especificado
uint32_t rsGetArray0(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el índice en la dimensión Array0 de la celda que se procesa, como lo especifica el contexto de kernel proporcionado.
El contexto del kernel contiene características comunes de las asignaciones que se iteran en índices y que se usan con muy poca frecuencia, como el índice Array0.
Puedes acceder al contexto del kernel si agregas un parámetro especial llamado "context" del tipo rs_kernel_context a la función de tu kernel. P.ej.,
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);
//...
}
Esta función muestra 0 si la dimensión Array0 no está presente.
rsGetArray1 : Índice en la dimensión Array1 para el contexto de kernel especificado
uint32_t rsGetArray1(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el índice en la dimensión Array1 de la celda que se procesa, como lo especifica el contexto de kernel proporcionado. Consulta rsGetArray0() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array1 no está presente.
rsGetArray2 : Índice en la dimensión Array2 para el contexto de kernel especificado
uint32_t rsGetArray2(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el índice en la dimensión Array2 de la celda que se procesa, según lo especificado en el contexto de kernel proporcionado. Consulta rsGetArray0() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array2 no está presente.
rsGetArray3 : Índice en la dimensión Array3 para el contexto de kernel especificado
uint32_t rsGetArray3(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el índice en la dimensión Array3 de la celda que se procesa, como lo especifica el contexto de kernel proporcionado. Consulta rsGetArray0() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array3 no está presente.
rsGetDimArray0 : Tamaño de la dimensión Array0 para el contexto de kernel especificado
uint32_t rsGetDimArray0(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión Array0 para el contexto de kernel especificado. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array0 no está presente.
rsGetDimArray1 : Tamaño de la dimensión Array1 para el contexto del kernel especificado
uint32_t rsGetDimArray1(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión Array1 para el contexto de kernel especificado. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array1 no está presente.
rsGetDimArray2 : Tamaño de la dimensión Array2 para el contexto del kernel especificado
uint32_t rsGetDimArray2(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión Array2 para el contexto de kernel especificado. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array2 no está presente.
rsGetDimArray3 : Tamaño de la dimensión Array3 para el contexto del kernel especificado
uint32_t rsGetDimArray3(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión Array3 para el contexto de kernel especificado. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si la dimensión Array3 no está presente.
rsGetDimHasFaces : Presencia de más de un rostro para el contexto del kernel especificado
bool rsGetDimHasFaces(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Devoluciones
Muestra true si hay más de un rostro presente; de lo contrario, muestra false. |
Si el kernel itera sobre un cubemap, esta función muestra "true" si hay más de un rostro presente. En todos los demás casos, el resultado es falso. Consulta rsGetDimX() para obtener una explicación del contexto.
rsAllocationGetDimFaces() es similar, pero muestra 0 o 1 en lugar de un bool.
rsGetDimLod : Cantidad de niveles de detalle para el contexto de kernel especificado
uint32_t rsGetDimLod(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra la cantidad de niveles de detalle para el contexto de kernel especificado. Esto es útil para los mipmaps. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si no se usa Level of Detail.
rsAllocationGetDimLOD() es similar, pero muestra 0 o 1 en lugar de la cantidad real de niveles.
rsGetDimX : Tamaño de la dimensión X para el contexto del kernel especificado
uint32_t rsGetDimX(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión X para el contexto del kernel especificado.
El contexto del kernel contiene características comunes de las asignaciones que se iteran en índices y que se usan con muy poca frecuencia, como el índice Array0.
Para acceder a ella, agrega un parámetro especial llamado "context" del tipo rs_kernel_context a la función de tu kernel. P.ej.,
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
uint32_t size = rsGetDimX(context); //...
Para obtener la dimensión de la asignación específica, usa rsAllocationGetDimX().
rsGetDimY : Tamaño de la dimensión Y para el contexto de kernel especificado
uint32_t rsGetDimY(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión X para el contexto del kernel especificado. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si la dimensión Y no está presente.
Para obtener la dimensión de la asignación específica, usa rsAllocationGetDimY().
rsGetDimZ : Tamaño de la dimensión Z para el contexto del kernel especificado
uint32_t rsGetDimZ(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el tamaño de la dimensión Z para el contexto de kernel especificado. Consulta rsGetDimX() para obtener una explicación del contexto.
Muestra 0 si la dimensión Z no está presente.
Para obtener la dimensión de la asignación específica, usa rsAllocationGetDimZ().
rsGetFace : Coordenada de la cara para el contexto del kernel especificado
rs_allocation_cubemap_face rsGetFace(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el rostro en el que se encuentra la celda procesada, según lo especificado en el contexto de kernel proporcionado. Consulta rsGetArray0() para obtener una explicación del contexto.
Muestra RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X si la dimensión del rostro no está presente.
rsGetLod : Índice en la dimensión Niveles de detalle para el contexto de kernel especificado
uint32_t rsGetLod(contexto rs_kernel_context); | Se agregó en el nivel de API 23. |
Muestra el índice en la dimensión Niveles de detalle de la celda que se procesa, según lo especificado en el contexto de kernel proporcionado. Consulta rsGetArray0() para obtener una explicación del contexto.
Muestra 0 si la dimensión Niveles de detalle no está presente.