Расчет флопов

Я пишу программу для расчета продолжительности, которая требуется моему процессору для выполнения одного «FLops». Для этого я написал код ниже

before = clock();
y= 4.8;
x= 2.3;
z= 0;
for (i = 0; i < MAX; ++i){
 z=x*y+z;
}
printf("%1.20f\n", ( (clock()-before )/CLOCKS_PER_SEC )/MAX);

Проблема в том, что я повторяю одну и ту же операцию. Разве компилятор не оптимизирует такого рода «Вещь»? Если да, то что мне нужно сделать, чтобы получить правильные результаты?

Я не использую функцию «ранд», поэтому это не противоречит моему результату.


person Chaker    schedule 03.03.2015    source источник
comment
Вам нужно будет либо объявить double before и double after, а затем использовать before = (double)clock(); (вы пропустили after), либо выполнить расчет как (double)(after - before) / CLOCKS_PER_SEC / MAX   -  person Weather Vane    schedule 03.03.2015
comment
На более высоких уровнях оптимизации, если вы не используете вычисленное z после выхода из цикла, вполне возможно, что компилятор заметит это и исключит все вычисления.   -  person twalberg    schedule 03.03.2015


Ответы (2)


Это имеет зависимость, переносимую циклом, и недостаточно вещей для параллельного выполнения, поэтому, если что-то вообще выполняется, это не будут FLOP, которые вы измеряете, с этим вы, вероятно, измерите задержку сложения с плавающей запятой. Циклическая цепочка зависимостей сериализует все эти дополнения. В этой цепочке есть несколько небольших боковых цепочек с умножениями в них, но они ни от чего не зависят, поэтому важна только их пропускная способность. Но эта пропускная способность будет лучше, чем задержка добавления на любом разумном процессоре.

Для реального измерения FLOP не существует единого рецепта. Оптимальные условия сильно зависят от микроархитектуры. Необходимое количество независимых цепочек зависимостей, оптимальное соотношение add/mul, следует ли использовать FMA — все зависит от этого. Обычно вам нужно сделать что-то более сложное, чем то, что вы написали, и если вы настроены на использование языка высокого уровня, вам нужно каким-то образом обмануть его, чтобы он вообще что-то делал.

Для вдохновения см. как мне достичь теоретический максимум 4 FLOP за цикл?

person harold    schedule 04.03.2015

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

Поэтому, если вы хотите рассчитать время для одного флопа для одной итерации этой программы, вам фактически придется вводить новые данные для каждой итерации. Действительно рассмотрите возможность использования rand() и просто задайте известное значение srand(1) или около того.

Ваши расчеты также должны отличаться; flops - это количество вычислений, которые ваша программа делает в вашем случае 2 * n (где n = MAX). Чтобы рассчитать количество времени на флоп, разделите используемое время на количество флопов.

person hallole    schedule 04.03.2015