2015-03-03 5 views
2

Я пишу программу для расчета продолжительности, которую мой процессор берет, чтобы сделать один «Вспышки». Для этого я написал код нижеРасчет 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); 

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

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

+1

Вам нужно будет либо объявить 'двойной before' и' двойной after', а затем использовать 'перед = (двойной) часы();' (вы пропустили вне 'after'), или, произведите вычисление как '(double) (after-before)/CLOCKS_PER_SEC/MAX' –

+0

На более высоких уровнях оптимизации, если вы не используете вычисленный' z' после выхода из цикла, вполне возможно, что компилятор может заметить что и устранить весь расчет. – twalberg

ответ

1

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

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

Для вдохновения см how do I achieve the theoretical maximum of 4 FLOPs per cycle?

+0

Хорошее объяснение, и спасибо за ссылку. – Chaker

0

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

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

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