2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помогите "организовать цикл" в OpenCL
Сообщение07.02.2012, 16:26 
Привет всем. Изучаю OpenCL, пока знания так себе. Написал минималки про сложение векторов и обработку картинок и изучил AMDшные лекции.

Та задача на которую замахиваюсь, требует такого алгоритма:

1. Инстанции кернела foo1() читают каждый свой кусочек большого массива глобальной памяти и получают продукт (несколько байт).
2. Ждем пока все инстанции foo1() завершат работу.
3. Кернел foo2() (в единственном экземпляре) собирает продукты от foo1() и делает между ними выбор.
4. foo2() изменяет ту область глобальной памяти, откуда пришел выбранный продукт foo1() и считает свой продукт.
5. На основе продукта foo2() и счетчика итераций принимается решение - либо конец алгоритма, либо идем на шаг 1.

Время выполнения foo2() по сравнению с foo1() ничтожно мало.

Вопрос, как это организовать со стороны хоста? Вот так:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++

while(!done)
{
clEnqueueNDRangeKernel(queue, foo1kernel, ..., event1 );
clWaitForEvents( event1 );

clEnqueueNDRangeKernel(queue, foo2kernel, ..., event2 );
clWaitForEvents( event2 );
clEnqueueReadBuffer(queue, foo2product, ... );

done = ProcessProduct(foo2product, i);
i++;
}

 

- точно фуй. Оверхеды убьют всю производительность.

 
 
 [ 1 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group