Это всегда так, что чем больше OP / B, тем лучше?
Не всегда. Целевое значение уравновешивает нагрузку на пропускную способность вычислительного канала и пропускную способность канала памяти (т. Е. Этот уровень операции / байта означает, что оба канала будут полностью загружены). По мере увеличения операционного / байтового уровня выше этого или некоторого уровня ваш код переключится с сбалансированного на вычислительный. Как только ваш код будет привязан к вычислениям, производительность будет зависеть от вычислительного канала, который является ограничивающим фактором. Дополнительное увеличение операционных / байтовых значений после этой точки может не повлиять на производительность кода.
как мы узнаем, сколько операций FP у нас есть? Является ли это сложением и умножением
Да, для простого кода, который вы показали, это сложение и умножение. Другие более сложные коды могут иметь и другие факторы (например, sin
, cos
и т. Д. c.), Которые также могут вносить свой вклад.
В качестве альтернативы «ручному подсчету» операций FP профилировщики GPU может указать количество операций FP, которые выполнил код.
как мы узнаем, сколько байтов загружено за операцию FP?
Как и в предыдущем вопросе, для простых кодов вы можете «посчитать вручную». Для сложных кодов вы можете попытаться использовать возможности профилировщика для оценки. Для показанного вами кода:
sum += A[row*N + i]*B[i*N + col];
Должны быть загружены значения от A
и B
. Если они float
количества, то они по 4 байта каждая. Это в сумме 8 байтов. Эта строка кода потребует 1 умножения с плавающей запятой (A * B) и одной операции добавления с плавающей запятой (sum + =). Компилятор объединит их в одну инструкцию (слитное умножение-сложение), но эффект net состоит в том, что вы выполняете две операции с плавающей запятой на 8 байтов. Операция / байт 2/8 = 1/4. L oop не меняет соотношение в этом случае. Чтобы увеличить это число, вам нужно изучить различные методы оптимизации, такие как умноженное на матрицу умноженной общей памяти или просто использовать CUBLAS.
(Операции типа row*N + i
равны integer arithmeti c и не влияют на нагрузку с плавающей запятой, хотя возможно, что они могут быть значительными с точки зрения производительности.)