Расчет GFlops

Мне интересно, как бы я рассчитал GFlops для моей программы, например, приложения CUDA.

Нужно ли мне измерять время выполнения и количество операций с плавающей запятой в моем коде? Если бы у меня была такая операция, как «logf», то была бы она рассчитана только на один флоп?

1

Решение

Количество ФАКТИЧЕСКИХ операций с плавающей запятой будет зависеть от того, как именно написан код (компиляторы могут оптимизировать в обоих направлениях, то есть объединять общие операции c = (a * 4.0 + b * 4.0); может становится c = (a + b) * 4.0, что на один меньше, чем вы написали. Но компилятор также может преобразовать что-то в БОЛЕЕ операции:

 c = a / b;

может превратиться в:

 temp = 1 / b;
c = temp * a;

(Это потому, что 1 / x «проще», чем y / x, а умножение быстрее деления).

Как упоминалось в комментариях, некоторые операции с плавающей запятой (log, sin, cos и т. Д.) Потребуют более одной, часто более десяти, операций, чтобы получить результат.

Еще один фактор, который необходимо учитывать, — это «грузы» и «магазины». Это может быть довольно сложно предсказать, так как это сильно зависит от генерации кода компилятора, количества регистров, доступных компилятору в данный момент, и т. Д., И т. Д., И т. Д. Количество загрузок и сохранений фактически учитывается или нет, зависит от того, как вы смотрите на вещи , но они, безусловно, рассчитывают на общее время выполнения. Если есть много данных для обработки, но каждый шаг действительно прост (например, c = a + b где a, b а также c являются векторами), время для извлечения данных из памяти значительно дольше, чем время выполнения add, С другой стороны, c = log(a) + log(b); почти наверняка «спрячет» время загрузки и сохранения результатов, потому что log само по себе занимает намного больше времени, чем операции загрузки или хранения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]