Widziałem w jednym poście, że możemy wywołać funkcję z jądra OpenCL. Ale w mojej sytuacji potrzebuję, aby ta złożona funkcja była równoległa (obsługiwana przez wszystkie dostępne wątki), więc czy muszę również nadać tej funkcji jądro i wywołać ją od razu jak funkcję z głównego jądra? lub jakie jest możliwe rozwiązanie tej sytuacji? Z góry dziękujęWywołanie kernela OpenCL z innego kernela OpenCL
Odpowiedz
Możesz wywoływać funkcje pomocnicze z jądra i będą one zrównoleglone w taki sam sposób, jak jądro, wyobraź sobie je tak, jak podano w kodzie twojego jądra. Tak więc każdy element pracy wywoła funkcję pomocnika dla zestawu roboczego, który obsługuje.
float4 helper_function(float4 input)
{
return input.x + input.y + input.z + input.w;
}
__kernel kernel_function(const float4* arr, float4* out)
{
id = get_global_id(0);
out[id] = helper_function(arr[id]);
}
Jeśli dobrze rozumiem twoje pytanie, chcesz wykonać osobne pełne przejście przez bufor z wnętrza jądra. Nie sądzę, że jest to możliwe z poziomu jądra, więc musisz utworzyć kod dla "wewnętrznego" przebiegu jako oddzielnego jądra, a także wywołać to jądro oddzielnie od kodu hosta. Dane wyjściowe tego jądra nie muszą być odczytywane z powrotem do pamięci hosta, ale mogą pozostać w pamięci urządzenia między wywołaniami jądra.
OpenCL 2.0 spec dodano nową funkcję dynamicznego paralelizmu.
6.13.17 Enqueuing Kernels
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host
interaction. ...
W poniższym przykładzie my_func_B enqueus my_func_A na urządzeniu:
kernel void
my_func_A(global int *a, global int *b, global int *c)
{
...
}
kernel void
my_func_B(global int *a, global int *b, global int *c)
{
ndrange_t ndrange;
// build ndrange information
...
// example – enqueue a kernel as a block
enqueue_kernel(get_default_queue(), ndrange, ^{my_func_A(a, b, c);});
...
}
- 1. Do czego służy stos kernela?
- 2. Bariery w OpenCL
- 3. Jak zrestartować telefon z systemem Android z kernela
- 4. Przykłady OpenCL z testami porównawczymi
- 5. OpenCL for Python
- 6. Pamięć w OpenCL
- 7. Rozpoczęcie samouczków OpenCL?
- 8. Inwersja macierzy w OpenCL
- 9. Unikalność urządzenia OpenCL
- 10. Kompilacja OpenCL na Linuksie
- 11. Porównanie CUDA vs OpenCL
- 12. OpenCL - wydajność OpenGL Interop
- 13. OpenCL grupy robocze
- 14. Czy Android obsługuje OpenCL?
- 15. Jak konstruować duże jądra OpenCL?
- 16. Programowanie GPU, CUDA lub OpenCL?
- 17. Czy opencl obsługuje wskaźniki funkcji?
- 18. Wyłącz OpenCL w OpenCV całkowicie
- 19. Umieścić V8 w aplikacji OpenCL?
- 20. Mierzenie czasu wykonania OpenCL jądra
- 21. OpenCL AMD vs NVIDIA performance
- 22. Niestandardowe typy w jądrze OpenCL
- 23. Różnica między OpenCV a OpenCL
- 24. Jak uzyskać pakiet OpenCL SDK?
- 25. OpenCL - przyrostowe sumowanie podczas obliczeń
- 26. Czy opencl obsługuje zmienne boolean?
- 27. Interakcja OpenCL/OpenGL z wieloma procesorami GPU
- 28. Ekskluzywny tryb obliczeniowy z OpenCL + NVidia
- 29. Pierwsze kroki z OpenCL na Windows 7
- 30. Jak korzystać z async_work_group_copy w OpenCL?
Dodawanie do sramij odpowiedzi, nazywając inny kernel od samego jądra nazywa się dynamicznego Równoległość. do tego potrzebujesz urządzenia obsługującego OpenCL 2.0. może odnosić się do http://stackoverflow.com/questions/12913640/opencl-dynamic-parallelism-gpu-spawned-threads – Meluha