Как минимизировать операции с плавающей запятой в приведенном ниже коде

StackOverflow https://stackoverflow.com/questions/9463493

  •  13-11-2019
  •  | 
  •  

Вопрос

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

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. генерация случайных целых чисел
  2. сохраняя их как doubleс
  3. добавляя их
  4. складывая и умножая их

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

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

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

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

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