Требуемое соотношение вычислений к памяти (OP / B) на графическом процессоре - PullRequest
0 голосов
/ 16 февраля 2020

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

  • Ограничение вычислений: производительность ограничена скоростью FLOPS. Ядра процессора полностью заняты (всегда есть над чем работать)
  • Ограничение памяти: производительность ограничена пропускной способностью памяти. Ядра процессора часто простаивают, потому что память не может выдавать данные достаточно быстро

    На изображении ниже показана скорость FLOPS, максимальная пропускная способность памяти и отношение требуемых вычислений к памяти, обозначенное (OP / B), для каждой микроархитектуры .

enter image description here

У меня также есть пример того, как вычислить этот показатель OP / B metri c. Пример: Ниже приведена часть кода CUDA для применения умножения матрицы на матрицу

for(unsigned int i = 0; i < N; ++i) {
  sum += A[row*N + i]*B[i*N + col];
}

, и способ вычисления OP / B для этого умножения матрицы на матрицу следующий:

  • Матричное умножение выполняет 0,25 OP / B
  • 1 добавление FP и 1 множитель FP для каждых 2 загруженных значений FP (8B)
  • Игнорирование хранилищ

и если мы хотим использовать это:

  • Но матричное умножение имеет большой потенциал для повторного использования. Для матриц NxN:
    • Загруженные данные: (2 входных матрицы) × (N ^ 2 значения) × (4 B) = 8N ^ 2 B
    • Операции: (N ^ 2 точечных произведения) (N добавляет + N мул каждый) = 2N ^ 3 OP
    • Потенциальное соотношение вычислений к памяти: 0,25N OP / B

Так что если я Я ясно понимаю это, у меня есть следующие вопросы:

  • Всегда бывает так, что чем больше OP / B, тем лучше?
  • как мы узнаем, сколько операций FP мы выполняем иметь ? Это сложения и умножения
  • Как мы узнаем, сколько байтов загружено за операцию FP?

1 Ответ

2 голосов
/ 16 февраля 2020

Это всегда так, что чем больше 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 и не влияют на нагрузку с плавающей запятой, хотя возможно, что они могут быть значительными с точки зрения производительности.)

...