Как минимизировать операции с плавающей запятой в приведенном ниже коде
Вопрос
Мне нужно свести к минимуму общее количество флопов в следующем коде. Кто-нибудь может быстро взглянуть и сказать мне, куда приложить свои усилия?Я пробовал несколько анализаторов производительности, но результаты не имели значения.
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;
}
Спасибо, Чо
Решение
Да, я не читал до последней строчки, но похоже, что вы просто:
- генерация случайных целых чисел
- сохраняя их как
double
с - добавляя их
- складывая и умножая их
IOW – я не вижу никакой пользы от дроби совсем, и целое число соответствующего размера будет лучше.Если это правда, то вы можете удалить каждый ФЛОП в программе ;)
Если это неточный сигнал, вы все равно можете использовать его в соответствующем диапазоне, затем просто увеличить масштаб сигнала, сохранить как целое число, а затем в некоторых случаях вернуть результат обратно в правильный диапазон.
Для mul/add соответствующего размера использование целых чисел будет намного быстрее и потенциально потребует гораздо меньше памяти — вы также можете применять к ним инструкции SIMD.
Кроме того, улучшение локальности кэша, минимизация ветвления и минимизация динамического распределения также могут сделать программу в несколько раз быстрее.