Подсчет флопов для кода! - PullRequest
5 голосов
/ 16 марта 2011

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

Это выглядит просто, но я запутался с некоторыми другими цифрами, приведенными ранее, поэтому было бы здорово, если бы кто-то мог дать точное число.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 16 марта 2011

Попробуйте либо взять код промежуточной сборки, либо декомпилировать exe.

Затем подсчитайте все операции с плавающей запятой (в коде сборки x86 они начинаются с префикса F, как FSIN).

5 голосов
/ 16 марта 2011

Я вижу (в порядке возрастания сложности):

  • 8 сложений (включая вычитания)
  • 3 умножения
  • 1 взаимно-квадратный корень

То, как они связаны друг с другом, сильно зависит от семейства процессоров.

1 голос
/ 16 марта 2011

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

Я считаю каждый +, /, - или *, где выражение содержит хотя бы одну переменную с плавающей запятой, поэтому индексы массива и инвариант цикла не учитываются, и оницелочисленные операции.

0 голосов
/ 16 марта 2011

Попробуйте использовать библиотеку измерения производительности, такую ​​как PAPI, они дают абстракции для аппаратных счетчиков, которые лучше всего подойдут для измерения FLOPS. PAPI_FLOPS.

...