Ringkasan
Fungsi rsForEach() dapat digunakan untuk memanggil kernel root suatu skrip.
Fungsi lainnya digunakan untuk mendapatkan karakteristik pemanggilan kernel yang mengeksekusi, seperti dimensi dan indeks saat ini. Fungsi ini menggunakan rs_kernel_context sebagai argumen.
Ringkasan
Jenis | |
---|---|
rs_for_each_strategy_t | Urutan pemrosesan sel yang disarankan |
rs_kernel | Menangani fungsi kernel |
konteks_kernel_rs_kernel | Menangani konteks pemanggilan kernel |
rs_script_call_t | Informasi iterasi sel |
Fungsi | |
---|---|
rsForSetiap | Meluncurkan kernel |
rsForEachInternal | (API Internal) Meluncurkan kernel dalam Skrip saat ini (dengan nomor slot) |
rsForEachWithOptions | Meluncurkan kernel dengan opsi |
rsGetArray0 | Indeks dalam dimensi Array0 untuk konteks kernel yang ditentukan |
rsGetArray1 | Indeks dalam dimensi Array1 untuk konteks kernel yang ditentukan |
rsGetArray2 | Indeks dalam dimensi Array2 untuk konteks kernel yang ditentukan |
rsGetArray3 | Indeks dalam dimensi Array3 untuk konteks kernel yang ditentukan |
rsGetDimArray0 | Ukuran dimensi Array0 untuk konteks kernel yang ditentukan |
rsGetDimArray1 | Ukuran dimensi Array1 untuk konteks kernel yang ditentukan |
rsGetDimArray2 | Ukuran dimensi Array2 untuk konteks kernel yang ditentukan |
rsGetDimArray3 | Ukuran dimensi Array3 untuk konteks kernel yang ditentukan |
rsGetDimHasFaces | Kehadiran lebih dari satu wajah untuk konteks kernel yang ditentukan |
rsGetDimLod | Jumlah tingkat detail untuk konteks kernel yang ditentukan |
rsGetDimX | Ukuran dimensi X untuk konteks kernel yang ditentukan |
rsGetDimY | Ukuran dimensi Y untuk konteks kernel yang ditentukan |
rsGetDimZ | Ukuran dimensi Z untuk konteks kernel yang ditentukan |
rsGetFace | Koordinat Wajah untuk konteks kernel yang ditentukan |
rsGetLod | Indeks dalam dimensi Tingkat Detail untuk konteks kernel yang ditentukan |
Jenis
rs_for_each_strategy_t : Urutan pemrosesan sel yang disarankan
Enum dengan nilai berikut:
RS_FOR_EACH_STRATEGY_SERIAL = 0 | Memilih region memori yang berdekatan. |
---|---|
RS_FOR_EACH_STRATEGY_DONT_CARE = 1 | Tidak ada preferensi. |
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2 | Pilih DST. |
RS_FOR_EACH_STRATEGY_TILE_Small = 3 | Pilih untuk memproses area persegi panjang yang kecil. |
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4 | Pilih untuk memproses area persegi panjang sedang. |
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5 | Memilih memproses area persegi panjang yang besar. |
Jenis ini digunakan untuk menyarankan cara kernel yang dipanggil harus melakukan iterasi pada sel alokasi. Ini hanyalah petunjuk. Penerapannya mungkin tidak mengikuti saran.
Spesifikasi ini dapat membantu perilaku caching dari kernel yang berjalan, mis. lokalitas cache saat pemrosesan didistribusikan melalui beberapa core.
rs_kernel : Menangani fungsi kernel
Jenis: void* Ditambahkan di API level 24
Jenis buram untuk fungsi yang ditentukan dengan atribut kernel. Nilai dari jenis ini dapat digunakan dalam panggilan rsForEach untuk meluncurkan kernel.
rs_kernel_context : Menangani konteks pemanggilan kernel
Typedef dari: const struct rs_kernel_context_t * Ditambahkan di API level 23
Konteks kernel berisi karakteristik umum dari alokasi yang diiterasi, seperti dimensi. Class ini juga berisi indeks yang jarang digunakan dari sel yang sedang diproses, seperti indeks Array0 atau tingkat detail saat ini.
Anda dapat mengakses konteks kernel dengan menambahkan parameter khusus bernama "context" dari jenis rs_kernel_context ke fungsi kernel Anda. Lihat rsGetDimX() dan rsGetArray0() untuk mengetahui contohnya.
rs_script_call_t : Informasi iterasi sel
Struktur dengan kolom berikut:
strategi rs_for_each_strategy_t | Saat ini diabaikan. Di masa mendatang, akan ada saran strategi iterasi sel. |
---|---|
{i>uint32_t xStart<i} | Memulai indeks dalam dimensi X. |
{i>uint32_t xEnd<i} | Indeks akhir (eksklusif) dalam dimensi X. |
uint32_t yStart | Indeks awal dalam dimensi Y. |
uint32_t yEnd | Indeks akhir (eksklusif) dalam dimensi Y. |
uint32_t zStart | Memulai indeks dalam dimensi Z. |
{i>uint32_t zEnd<i} | Indeks akhir (eksklusif) dalam dimensi Z. |
{i>uint32_t arrayStart<i} | Memulai indeks dalam dimensi Array0. |
{i>uint32_t arrayEnd<i} | Indeks akhir (eksklusif) dalam dimensi Array0. |
uint32_t array1Start | Indeks awal dalam dimensi Array1. |
{i>uint32_t array1End<i} | Indeks akhir (eksklusif) dalam dimensi Array1. |
{i>uint32_t array2Start<i} | Indeks awal dalam dimensi Array2. |
{i>uint32_t array2End<i} | Indeks akhir (eksklusif) dalam dimensi Array2. |
uint32_t array3Start | Memulai indeks dalam dimensi Array3. |
{i>uint32_t array3End<i} | Indeks akhir (eksklusif) dalam dimensi Array3. |
Struktur ini digunakan untuk memberikan informasi iterasi ke panggilan rsForEach. Saat ini sel digunakan untuk membatasi pemrosesan pada subset sel. Pada versi mendatang, teks ini juga akan digunakan untuk memberikan petunjuk tentang cara terbaik untuk melakukan iterasi pada sel-sel.
Kolom Start bersifat inklusif dan kolom End bersifat eksklusif. Misalnya, untuk melakukan iterasi pada sel 4, 5, 6, dan 7 dalam dimensi X, tetapkan xStart ke 4 dan xEnd ke 8.
Fungsi
rsForEach : Meluncurkan kernel
void rsForEvery(rs_kernel kernel, ... ...); | Ditambahkan di API level 24 |
membatalkan rsForEach(skrip rs_script, input rs_allocation, output rs_allocation); | Level API 14 - 23 |
rsForEach(skrip rs_script, input rs_allocation, output rs_allocation, const void* usrData); | Dihapus dari API level 14 dan yang lebih tinggi |
rsForEach(rs_script, input rs_allocation, output rs_allocation, const void* usrData, const rs_script_call_t* sc); | Dihapus dari API level 14 dan yang lebih tinggi |
rsForEach(skrip rs_script, input rs_allocation, output rs_allocation, const void* usrData, size_t usrDataLen); | Level API 14 - 20 |
void rsForEach(skrip rs_script, input rs_allocation, output rs_allocation, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); | Level API 14 - 20 |
Parameter
skrip | Skrip untuk dipanggil. |
---|---|
input | Alokasi sebagai sumber data. |
output | Alokasi untuk menulis tanggal. |
usrData | Data buatan pengguna untuk diteruskan ke skrip. Mungkin NULL. |
sc | Informasi kontrol tambahan yang digunakan untuk memilih sub-wilayah dari alokasi yang akan diproses atau menyarankan strategi berjalan. Mungkin NULL. |
usrDataLen | Ukuran struktur userData. Ini akan digunakan untuk menyalin data dangkal jika diperlukan. |
{i>kernel<i} | Penunjuk fungsi ke fungsi yang ditentukan dengan atribut kernel. |
... | Alokasi input dan output |
Menjalankan kernel pada nol atau beberapa alokasi input. Argumen tersebut diteruskan setelah argumen rs_kernel. Jika kernel yang ditentukan menampilkan sebuah nilai, alokasi output harus ditentukan sebagai argumen terakhir. Semua alokasi input, dan alokasi output, jika ada, harus memiliki dimensi yang sama.
Ini adalah fungsi sinkron. Panggilan ke fungsi ini hanya ditampilkan setelah semua pekerjaan selesai untuk semua sel alokasi input. Jika fungsi kernel menampilkan nilai apa pun, panggilan akan menunggu hingga semua hasil ditulis ke alokasi output.
Hingga API level 23, kernel secara implisit ditetapkan sebagai kernel yang bernama "root" dalam skrip yang ditentukan, dan hanya satu alokasi input yang dapat digunakan. Mulai API level 24, fungsi kernel arbitrer dapat digunakan, seperti yang ditetapkan oleh argumen kernel. Argumen skrip dihapus. Kernel harus ditetapkan dalam skrip saat ini. Selain itu, lebih dari satu input dapat digunakan.
Misalnya,
float __attribute__((kernel)) square(float a) {
return a * a;
}
void compute(rs_allocation ain, rs_allocation aout) {
rsForEach(square, ain, aout);
}
rsForSetiapInternal : (API Internal) Meluncurkan kernel dalam Skrip saat ini (dengan nomor slot)
void rsForEachInternal(int slot, rs_script_call_t* options, int hasOutput, int numInputs, rs_allocation* allocs); | Ditambahkan di API level 24 |
Parameter
slot | |
---|---|
opsi | |
hasOutput | Menunjukkan apakah kernel menghasilkan output |
numInput | Jumlah alokasi input |
alokasi | Alokasi input dan output |
API internal untuk meluncurkan kernel.
rsForEachWithOptions : Meluncurkan kernel dengan berbagai opsi
void rsForEachWithOptions(kernel rs_kernel, rs_script_call_t* options, ... ...); | Ditambahkan di API level 24 |
Parameter
{i>kernel<i} | Penunjuk fungsi ke fungsi yang ditentukan dengan atribut kernel. |
---|---|
opsi | Opsi peluncuran |
... | Alokasi input dan output |
Meluncurkan kernel dengan cara yang mirip dengan rsForEach. Namun, fungsi ini hanya memproses sel di subruang indeks yang ditentukan dalam opsi, bukan memproses semua sel dalam input. Dengan ruang indeks yang ditentukan secara eksplisit oleh opsi, tidak diperlukan alokasi input atau output untuk peluncuran kernel menggunakan API ini. Jika diteruskan, alokasi harus cocok dengan jumlah argumen dan nilai hasil yang diharapkan oleh fungsi kernel. Alokasi output ada jika dan hanya jika kernel memiliki nilai yang ditampilkan non-void.
Misalnya,
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 : Indeks dalam dimensi Array0 untuk konteks kernel yang ditentukan
uint32_t rsGetArray0(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan indeks dalam dimensi Array0 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan.
Konteks kernel berisi karakteristik umum dari alokasi yang diiterasi dan indeks yang jarang digunakan, seperti indeks Array0.
Anda dapat mengakses konteks kernel dengan menambahkan parameter khusus bernama "context" dengan
jenis rs_kernel_context ke fungsi kernel Anda. Misalnya,
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);
//...
}
Fungsi ini mengembalikan 0 jika dimensi Array0 tidak ada.
rsGetArray1 : Indeks dalam dimensi Array1 untuk konteks kernel yang ditentukan
uint32_t rsGetArray1(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan indeks dalam dimensi Array1 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.
Mengembalikan 0 jika dimensi Array1 tidak ada.
rsGetArray2 : Indeks dalam dimensi Array2 untuk konteks kernel yang ditentukan
uint32_t rsGetArray2(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan indeks dalam dimensi Array2 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.
Mengembalikan 0 jika dimensi Array2 tidak ada.
rsGetArray3 : Indeks dalam dimensi Array3 untuk konteks kernel yang ditentukan
uint32_t rsGetArray3(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan indeks dalam dimensi Array3 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.
Mengembalikan 0 jika dimensi Array3 tidak ada.
rsGetDimArray0 : Ukuran dimensi Array0 untuk konteks kernel yang ditentukan
uint32_t rsGetDimArray0(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi Array0 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika dimensi Array0 tidak ada.
rsGetDimArray1 : Ukuran dimensi Array1 untuk konteks kernel yang ditentukan
uint32_t rsGetDimArray1(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi Array1 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika dimensi Array1 tidak ada.
rsGetDimArray2 : Ukuran dimensi Array2 untuk konteks kernel yang ditentukan
uint32_t rsGetDimArray2(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi Array2 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika dimensi Array2 tidak ada.
rsGetDimArray3 : Ukuran dimensi Array3 untuk konteks kernel yang ditentukan
uint32_t rsGetDimArray3(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi Array3 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika dimensi Array3 tidak ada.
rsGetDimHasFaces : Kehadiran lebih dari satu wajah untuk konteks kernel yang ditentukan
bool rsGetDimHasFaces(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Return
Menampilkan true jika ada lebih dari satu wajah, false jika tidak. |
Jika kernel melakukan iterasi pada peta kubus, fungsi ini akan menampilkan nilai benar (true) jika ada lebih dari satu wajah. Dalam semua kasus lain, nilai salah (false) akan ditampilkan. Lihat rsGetDimX() untuk mendapatkan penjelasan konteks.
rsAllocationGetDimFaces() serupa, tetapi menampilkan 0 atau 1, bukan bool.
rsGetDimLod : Jumlah tingkat detail untuk konteks kernel yang ditentukan
uint32_t rsGetDimLod(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan jumlah tingkat detail untuk konteks kernel yang ditentukan. Hal ini berguna untuk mipmap. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika Level of Detail tidak digunakan.
rsAllocationGetDimLOD() serupa, tetapi menampilkan 0 atau 1 sebagai jumlah level sebenarnya.
rsGetDimX : Ukuran dimensi X untuk konteks kernel yang ditentukan
uint32_t rsGetDimX(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi X untuk konteks kernel yang ditentukan.
Konteks kernel berisi karakteristik umum dari alokasi yang diiterasi dan indeks yang jarang digunakan, seperti indeks Array0.
Anda dapat mengaksesnya dengan menambahkan parameter khusus bernama "context" dengan jenis rs_kernel_context ke fungsi kernel Anda. Misalnya,
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
uint32_t size = rsGetDimX(context); //...
Untuk mendapatkan dimensi alokasi spesifik, gunakan rsAllocationGetDimX().
rsGetDimY : Ukuran dimensi Y untuk konteks kernel yang ditentukan
uint32_t rsGetDimY(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi X untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika dimensi Y tidak ada.
Untuk mendapatkan dimensi alokasi spesifik, gunakan rsAllocationGetDimY().
rsGetDimZ : Ukuran dimensi Z untuk konteks kernel yang ditentukan
uint32_t rsGetDimZ(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan ukuran dimensi Z untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.
Mengembalikan 0 jika dimensi Z tidak ada.
Untuk mendapatkan dimensi alokasi spesifik, gunakan rsAllocationGetDimZ().
rsGetFace : Koordinat Wajah untuk konteks kernel yang ditentukan
rs_allocation_cubemap_face rsGetFace(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan wajah tempat sel yang sedang diproses ditemukan, seperti yang ditetapkan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.
Menampilkan RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X jika dimensi wajah tidak ada.
rsGetLod : Indeks dalam dimensi Tingkat Detail untuk konteks kernel yang ditentukan
uint32_t rsGetLod(konteks rs_kernel_context); | Ditambahkan di API level 23 |
Menampilkan indeks dalam dimensi Tingkat Detail sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan tentang konteksnya.
Menampilkan 0 jika Tingkat dimensi Detail tidak ada.