Вопрос

Это действительно отнимает у меня время.Я не смог найти простой способ оценить 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_флопс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top