Назначить инструкции / алгоритмы конкретным ALU с помощью CUDA / OpenCL?

Я новичок в программировании на GPU. Я прочитал материал, объясняющий основные концепции.

Однако я хочу знать, можно ли назначить набор инструкций или целый алгоритм / двоичный файл конкретному ALU, чтобы я мог быть уверен, что эти инструкции были выполнены только этим ALU (следовательно, в обход системы, которая автоматически позаботится о распараллеливании)?

Я должен «протестировать» отдельные ALU на графическом процессоре на предмет возможных задержек вычислений между ними. Таким образом, я хочу назначить (аналогичный) набор инструкций нескольким конкретным ALU, измерить время, необходимое для выполнения этого набора инструкций, и сравнить результаты, если есть какие-либо различия.

В общем, я хочу проверить графический процессор на наличие определенных источников состояния гонки. Первое, о чем я подумал, - это потенциальная мизерная разница в скорости выполнения разных ALU. Возможно, вы, ребята, знаете о других потенциальных источниках состояния гонки.

Однако, поскольку моя цель довольно диаметрально противоположна типичному использованию графического процессора (парллелизация и т. Д.), Для меня довольно сложно понять, как я могу получить доступ к отдельному ALU на низком уровне с помощью общих инструментов.

С наилучшими пожеланиями,


person Richard Laurant    schedule 16.10.2013    source источник
comment
Графические процессоры имеют индивидуальные планировщики деформации, к которым, насколько мне известно, у вас нет доступа. Например, для архитектуры Fermi устройство имеет планировщик Giga-Thread Scheduler, который распределяет работу на разные потоковые мультипроцессоры, и планировщик Dual-Warp, который отправляет деформации на отдельные ядра. Но это прозрачно для пользователя. Что вы можете сделать для профилирования отдельного человека или последовательности инструкций, так это использовать библиотеку трассировки NVTX, которая помогает вам аннотировать часть кода, которая впоследствии будет профилирована трассировкой Parallel Nsight.   -  person Vitality    schedule 16.10.2013


Ответы (1)


У графических процессоров есть индивидуальные планировщики деформации, к которым у вас нет доступа.

Например, для архитектуры Fermi устройство имеет планировщик Giga-Thread Scheduler, который распределяет работу на разные потоковые мультипроцессоры, и планировщик Dual-Warp внутри, который отправляет деформации на отдельные ядра. Но это прозрачно для пользователя.

Что вы можете сделать для профилирования отдельного человека или последовательности инструкций, так это использовать библиотеку трассировки NVTX, которая помогает вам аннотировать часть кода, которая впоследствии будет профилирована трассировкой Parallel Nsight.

Вы можете найти некоторые материалы по библиотеке NVTX по адресу

Совет CUDA Pro: создание пользовательского профиля приложения Сроки с NVTX

Оптимизация производительности приложений с помощью инструментов профилирования CUDA < / а>

и в главе 3 книги Роба Фарбера «Проектирование и разработка приложений CUDA».

Что касается использования NVTX, взгляните на мой вопрос здесь:

Использование расширения инструментов NVIDIA в Visual Studio 2010

person Vitality    schedule 16.10.2013
comment
Спасибо, я думаю, мне нужно еще немного покопаться в этой теме, чтобы дать достойный ответ. На данный момент это кажется лучшим (и единственным) ответом. - person Richard Laurant; 17.10.2013
comment
Одна идея убедиться, что один и тот же набор инструкций обрабатывается разными ALU: насколько мне известно, все потоки одного и того же блока потока выполняются в одном потоковом мультипроцессоре (SM) одновременно. Таким образом, если я назначаю набор инструкций нескольким потокам, которые все находятся в разных блоках, не должно ли это привести к ситуации, когда гарантировано, что эти инструкции вычисляются разными SM и, следовательно, разными ALU? С уважением, P - person Richard Laurant; 22.10.2013