Привет всем. Изучаю OpenCL, пока знания так себе. Написал минималки про сложение векторов и обработку картинок и изучил AMDшные лекции.
Та задача на которую замахиваюсь, требует такого алгоритма:
1. Инстанции кернела foo1() читают каждый свой кусочек большого массива глобальной памяти и получают продукт (несколько байт).
2. Ждем пока все инстанции foo1() завершат работу.
3. Кернел foo2() (в единственном экземпляре) собирает продукты от foo1() и делает между ними выбор.
4. foo2() изменяет ту область глобальной памяти, откуда пришел выбранный продукт foo1() и считает свой продукт.
5. На основе продукта foo2() и счетчика итераций принимается решение - либо конец алгоритма, либо идем на шаг 1.
Время выполнения foo2() по сравнению с foo1() ничтожно мало.
Вопрос, как это организовать со стороны хоста? Вот так:
while(!done)
{
clEnqueueNDRangeKernel(queue, foo1kernel, ..., event1 );
clWaitForEvents( event1 );
clEnqueueNDRangeKernel(queue, foo2kernel, ..., event2 );
clWaitForEvents( event2 );
clEnqueueReadBuffer(queue, foo2product, ... );
done = ProcessProduct(foo2product, i);
i++;
}
- точно фуй. Оверхеды убьют всю производительность.