Как минимизировать операции с плавающей запятой в приведенном ниже коде - PullRequest
1 голос
/ 27 февраля 2012

Мне нужно минимизировать общее количество флопов в следующем коде, может кто-нибудь, пожалуйста, взгляните и подскажите, куда мне приложить усилия?Я пробовал несколько анализаторов производительности, но результаты были неуместны ..

int twoDToOneD(int i, int j, int nRows)
{
return j*nRows + i;
}

double* addMatrices(int m, int n, double* A, double* B, bool add)
{
double* C = new double[m*n];
double* pA = A;
double* pB = B;
double* pC = C;

int i = m*n;

while(i--)
{
    if(add)
    {
        *pC = *pA + *pB;
    } else 
    {
        *pC = *pA - *pB;
    }

    pC++;
    pA++;
    pB++;
}

return C;
}

Спасибо, Чо

1 Ответ

0 голосов
/ 27 февраля 2012

Да, я не читал каждую последнюю строку, но похоже, что вы просто:

  1. генерируете случайные целые числа
  2. сохраняя их как double s
  3. добавление их
  4. добавление и умножение их

IOW - я не вижу использования дроби вообще и целого числа соответствующего размерабудет лучше.Если это так, вы можете удалить все FLOP в программе;)

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

Для mul / add соответствующего размера использование целых чисел будет намного быстрее и, возможно, потребует гораздо меньше памяти - вы также можете применять к ним SIMD-инструкции.

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

...