Вопрос
Это действительно отнимает у меня время.Я не смог найти простой способ оценить FLOPS для следующего кода (цикла): Сколько FLOPS требуется для одной итерации цикла:
float func(float * atominfo, float energygridItem, int xindex, int yindex)
{
...
for (atomid=0; atomid<numatoms*4; atomid+=4)
{
float dy = coory - atominfo[atomid+2];
float dysqpdzsq = (dy * dy) + atominfo[atomid+3];
float dx1 = coorx1 - atominfo[atomid+1];
float s, y, t;
s = atominfo[atomid] * (1.0f / sqrtf(dx1*dx1 + dysqpdzsq));
y = s - energycomp1;
t = energyvalx1 + y;
energycomp1 = (t - energyvalx1) - y;
energyvalx1 = t;
}
...
}
Это выглядит просто, но я запутался в некоторых других цифрах, приведенных ранее, поэтому было бы здорово, если бы кто-нибудь мог назвать точную цифру.
Спасибо.
Решение
Я вижу (в порядке увеличения сложности):
- 8 дополнений (вкл. Вычитания)
- 3 умножения
- 1 взаимный квадратный корень
То, как они связаны друг с другом, сильно зависит от семейства процессоров.
Другие советы
Попробуйте либо взять промежуточный код сборки, либо декомпилировать EXE.
Затем подсчитайте все операции с плавающей запятой (в коде сборки x86 они начинаются с F
Префикс как FSIN
).
Я считаю 12 плюс SQRT (который, вероятно, использует метод Ньютона, который является циклом), но это зависит от типов данных некоторых переменных, которые вы не указали, и результат компиляции (который может добавить больше или оптимизировать некоторые операции).
Я считаю каждый +, /, -или *, где выражение содержит по крайней мере одну переменную с плавающей запятой, поэтому индексы массива и инвариант цикла не учитываются, и это целочисленные операции.
Попробуйте использовать библиотеку измерения производительности, например PAPI, они предоставляют абстракции аппаратным счетчикам, которые лучше всего подходят для измерения FLOPS.PAPI_флопс.