Первые общие замечания:
В общем, то, что вы делаете, - это в основном бесполезное упражнение, и оно противоположно тому, как большинство людей, вероятно, будут проводить анализ производительности.
Первое, что нужно отметить, это то, что пиковое значение, которое вы цитируете, предназначено исключительно для инструкций умножения-сложения с плавающей запятой (FMAD), которые считаются двумя FLOPS и могут быть удалены с максимальной скоростью, равной одному за цикл. Другие операции с плавающей запятой, которые удаляются с максимальной скоростью, равной одному за цикл, формально будут классифицироваться только как один FLOP, в то время как другие могут потребовать вывода многих циклов. Поэтому, если вы решили сравнить производительность ядра с этим пиком, вы действительно сравниваете производительность своего кода с потоком чистых инструкций FMAD, и не более того.
Второй момент заключается в том, что когда исследователи цитируют значения FLOP / s из фрагмента кода, они обычно используют модель подсчет FLOP для операции, а не пытаются подсчитать инструкции. Матричное умножение и эталонные показатели Linpack LU являются классическими примерами такого подхода к сравнительному анализу производительности. Нижняя граница количества операций этих вычислений точно известна, поэтому вычисленная пропускная способность - это просто нижняя граница, деленная на время. Фактическое количество команд не имеет значения. Программисты часто используют всевозможные методы, в том числе случайные вычисления, умозрительные или прогнозные вычисления и множество других идей для ускорения работы кода. Фактический счетчик FLOP такого кода не имеет значения, ссылка всегда равна счетчику FLOP модели.
Наконец, если посмотреть на количественную оценку производительности, обычно есть только две точки сравнения, представляющие реальный интерес
- Версия А кода работает быстрее, чем версия B на том же оборудовании?
- Работает ли аппарат A лучше, чем аппарат B, выполняющий интересующую задачу?
В первом случае вам действительно нужно только измерить время выполнения. Во втором подходящей мерой обычно является не FLOP / с, это полезные операции в единицу времени (количество записей в секунду при сортировке, количество ячеек в секунду при механическом моделировании жидкости и т. Д.). Иногда, как упомянуто выше, полезными операциями могут быть модель FLOP-счет операции известной теоретической сложности. Но фактическое число команд с плавающей запятой редко, если вообще когда-либо, входит в анализ.
Если вы действительно заинтересованы в оптимизации и понимании производительности вашего кода, то, возможно, эта презентация Паулюса Микикявичюса из NVIDIA могла бы заинтересовать.
Обращение к пунктам маркированного списка:
Правильный ли этот подход?
Строго говоря, нет. Если вы подсчитываете операции с плавающей запятой, вам нужно знать точное число FLOP из кода, который выполняет GPU. Операция sqrt
может потреблять намного больше, чем один FLOP, в зависимости от ее реализации и характеристик числа, на котором она работает, например. Компилятор также может выполнить много оптимизаций, которые могут изменить фактическое количество операций / команд. Единственный способ получить действительно точный счетчик - это дизассемблировать скомпилированный код и подсчитывать отдельные операнды с плавающей запятой, возможно, даже требующие предположений о характеристиках значений, которые будет вычислять код.
А как насчет сравнений (если (a> b) тогда ....)? Должен ли я их также учитывать?
Они не являются операциями умножения и сложения с плавающей запятой, поэтому нет.
Можно ли использовать профилировщик CUDA для более простых и точных результатов? Я попробовал счетчик инструкций, но не мог понять, что означает цифра.
Не совсем. Профилировщик не может различить вторжение с плавающей запятой и любые другие типы команд, поэтому (по состоянию на 2011 год) подсчет FLOP из фрагмента кода через профилировщик невозможен. [РЕДАКТИРОВАТЬ: см. Превосходный ответ Грега ниже для обсуждения средств подсчета FLOP, доступных в версиях инструментов профилирования, выпущенных с момента написания этого ответа]