Как работает очередь команд opencl и что я могу от нее спросить - PullRequest
6 голосов
/ 11 августа 2011

Я работаю над алгоритмом, который много раз выполняет одну и ту же операцию. Поскольку операция состоит из некоторой линейной алгебры (BLAS), я бы попробовал использовать для этого графический процессор.

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

call kernel1(return event1)
call kernel2(wait for event 1, return event 2)
...
call kernel1000000(vait for event 999999)

Теперь мой вопрос: все это передается в графический чип или драйвер сохраняет очередь? Там есть ограничение на количество событий, которые я могу использовать, или на длину очереди команд, я посмотрел вокруг, но не смог найти это.

Я использую atMonitor для проверки использования моего gpu ', и его довольно сложно поднять выше 20%, может ли это быть просто из-за того, что я не могу отправлять вызовы там достаточно быстро? Мои данные уже хранятся в графическом процессоре, и все, что я передаю, - это реальные звонки.

Ответы [ 2 ]

5 голосов
/ 18 июня 2012

Во-первых, вам не следует ждать события от предыдущего ядра, если только следующее ядро ​​не будет зависеть от данных этого предыдущего ядра.Использование устройства (обычно) зависит от того, что всегда находится в очереди.Ждать события только тогда, когда вам нужно ждать события.

"все это передается в графический чип или драйвер сохраняет очередь?"

Это определяется реализацией.Помните, OpenCL работает не только на графических процессорах!С точки зрения дихотомии устройства / хоста в стиле CUDA вы, вероятно, должны рассмотреть операции очереди команд (для большинства реализаций) на «хосте».

Попробуйте поставить в очередь несколько вызовов ядра без ожидания между ними.Кроме того, убедитесь, что вы используете оптимальный размер рабочей группы.Если вы сделаете оба из них, вы сможете максимально использовать свое устройство.

1 голос
/ 12 августа 2011

К сожалению, я не знаю ответов на все ваши вопросы, и вы меня теперь тоже удивляете тем же, но я могу сказать, что сомневаюсь, что очередь OpenCL когда-либо заполнится, поскольку ваш GPU должен завершить выполнениепоследняя команда в очереди до того, как подано не менее 20 команд.Это верно только в том случае, если у вашего GPU есть «сторожевой таймер», потому что это остановит смехотворно длинные ядра (я думаю, 5 или более секунд) от выполнения.

...