2016-01-05 2 views
0

Я использую JavaCL API, и мне нужно выполнить операцию, когда одно ядро ​​нужно запускать много раз. Для того, чтобы изобразить принцип я написал алгоритм:OpenCL вызывает одно и то же ядро ​​много раз

for(int k = 0; k < n; k++){ 
    CLEvent calculation = kernels.calculation(queue, d_in2, d_in1, d_out, n, k, new int[] {n,n}, null); 
    (wait till the end of the "calculation" kernel) 
    (take d_out and give as an input to "calculation" kernel) 
    (launch calculation kernel again) 
} 

Перед запуском следующего «вычисления» ядро, то первым следует подождать до конца первого ядра и результаты первого ядра должны быть перешел к следующему.

Как реализовать этот алгоритм в главном коде JavaCL? Я думаю, что пример с любым API OpenCl, а также с кодом OpenCL в C++ был бы полезен.

ответ

0

OpenCL основан на очереди. Скажем, у вас есть очередь, и вы вложили в нее 3 ядра, A, B, C. B будет не выполнить до того, как A закончен, гарантирован (если вы специально не запросите очередь команд из очереди), и ни один из них выполнит C до того, как B закончит.

Это означает, что если у вас есть 2 буфера, в и, вы можете просто сделать что-то вроде этого (псевдокод)

for(int i=0; i<iterations/2; i++) 
{ 
    clSetKernelArg(kernelA, 0, in) 
    clSetKernelArg(kernelA, 1, out) 
    launchkernelA 

    clSetKernelArg(kernelA, 1, in) 
    clSetKernelArg(kernelA, 0, out) 
    launchkernelA 
} 

Это пинг-понг данные между двумя буферами, гарантируя, что каждый ядра запускается с выходом на предыдущий запуск ядра в качестве его ввода

В вашем случае это выглядит так, как будто ваши данные немного сложнее, но этот принцип по-прежнему применяется