Модель исполнения OpenCL с несколькими ядрами в очереди - PullRequest
2 голосов
/ 06 декабря 2011

Мне было любопытно, как GPU выполняет одно и то же ядро ​​несколько раз.

У меня есть ядро, которое ставится в очередь сотни (возможно, тысячи) раз подряд, и с помощью AMD App Profiler я заметил, что оно будет очень быстро выполнять кластеры ядер, а затем, как по маслу, время от времени ядро ​​будет " повесить "(т. е. принимать на порядки дольше, чтобы выполнить). Я думаю, что каждое 64-е ядро ​​зависает.

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

Есть ли что-то в модели исполнения, которую мне не хватает (возможно, другие программы / ОС, обращающиеся к графическому процессору или частота синхронизации памяти графического процессора). Я тестирую это на карте ATI HD5650 под Windows 7 (64-разрядная версия) с AMD App SDK 2.5 с выполнением очереди по порядку.

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

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

1 Ответ

2 голосов
/ 08 декабря 2011

Вероятно, вы видите эффект от максимального числа одновременных задач вашего графического процессора.Каждая поставленная в очередь задача назначается одному или нескольким мультипроцессорам, которые часто способны одновременно запускать сотни рабочих элементов одного и того же ядра, поставленных в очередь в одном вызове.Возможно, вы видите, что среда выполнения OpenCL ожидает освобождения одного из мультипроцессоров.Это в наибольшей степени относится к проблеме занятости - если размер рабочей области не может поддерживать многопроцессорность занятой, из-за задержек памяти и всего остального, он имеет циклы простоя.Ограничение здесь зависит от того, сколько регистров (локальной или частной памяти) требует ваше ядро.Итак, вы хотите, чтобы ваше ядро ​​работало с несколькими частями данных больше, чем с очередями.

Включено ли в ваше измерение считывание результатов очевидно быстрых казней?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...