Задать вопрос
@ehevnlem
Программирую с 1975, в интернете с 1993.

Почему процессоры gpu не любят разветвлений в программе?

Я читал что процессоры одного ядра выполняют один набор инструкций для разных данных. Разветвления в коде нарушают их работу. Что происходит? Я читал что все процессоры ждут одного, пока он не закончил работу.
  • Вопрос задан
  • 477 просмотров
Подписаться 3 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 4
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Шина pci express просто тихоход по сравнению с памятью карты, и сами CUDA ядра по своей природе работают только вместе. Так что любое условие сбрасывает конвейер и загружает pci express причем ядра в это время простаивают.
Ответ написан
@rPman
не совсем верно это помещать в ответ, я не уверен.

Если я верно понимаю, код в GPU общий для всех ядер (там правда разные типы, не только вычислительные, и у каждого свой язык и правила, но мы говорим про конкретно вычисления), это значит когда ты запускаешь kernel, инструкции выполняются одновременно на всех ядрах синхронно,.. прыжок по условию это пропуск какой то секции инструкций, это значит ядра, у которых выбран пропуск инструкций будут ждать когда другие ядра, для которых нужно пройти эту секцию, завершат вычисления (гуглить thread divergence).

Но это было актуально на заре появления gpgpu, возможно сейчас все сложнее, внутри чипа ядра распределены по нескольким блокам, сами блоки как то разделяют память, есть своя регистровая и кеш память.

Кстати на практике большее значение имеет работа именно с оперативной памятью, там она блоками разбита, как именно блоки общаются между собой вопрос (единая шина или матричная структура это хз) но в любом случае если код ждет память, его будут ждать все (соответственно все в пределах секции)... компилятор почти наверняка кеширует данные из глобальной памяти в разделяемую и регистровую (для блоков и соответственно ядер), т.е. все будет зависеть еще и от работы оптимизатора.
Ответ написан
@vadimr
Процессор GPU выполняет так называемую векторно-конвейерную обработку. Это означает, что у него имеется набор конвейеров для векторов, то есть связанных между собой функциональных узлов, которые по очереди совершают однотипные операции над элементами массивов. Представьте себе конвейер на автомобильном заводе – на первом рабочем месте на шасси привинтили двигатель, потом конвейер подвинулся, стали там же прикручивать двигатель на следующее шасси, а на первое шасси в это время на втором рабочем месте устанавливают коробку передач, и т.д. Так же и в векторно-конвейерном процессоре. Он построен на том, что на каждом этапе конвейера выполняются одинаковые операции над разными элементами вектора. Компилятор разворачивает операции с массивами или простой цикл в такую конвейерную обработку. А если там будут условные операторы, всё сломается. Получится, что рабочий иногда должен монтировать двигатель, а иногда клетку с хомячком вместо него. Разброд и шатания, тем более, что эти операции могут быть разными по продолжительности. Конвейер так не работает. Поэтому условная операция будет вызывать очень длительную перенастройку контейнера на новую последовательность операций обработки.
Ответ написан
@ehevnlem Автор вопроса
Программирую с 1975, в интернете с 1993.
Спасибо за подсказки. https://www.google.com/url?sa=t&source=web&rct=j&o...
Здесь описан benchmark который определяет цену развлетвений. Наверное это единственный способ ее узнать. Также у меня был вопрос о быстродействии иобеме разных видов памяти карты. Тоже надо писать benchmark
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы