Como minimizar operações de ponto flutuante no código abaixo
Pergunta
Preciso minimizar a quantidade total de flops no código a seguir. Alguém pode dar uma olhada rápida e me dizer onde colocar meu esforço?Eu tentei vários analisadores de desempenho, mas os resultados foram irrelevantes.
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;
}
Obrigado, Cho
Solução
Certo, não li todas as linhas, mas parece que você está simplesmente:
- gerando entradas aleatórias
- armazenando-os como
double
é - adicionando-os
- somando e multiplicando-os
IOW - não vejo utilidade da fração de forma alguma, e um número inteiro de tamanho apropriado será superior.Se isso for verdade, você pode remover todos os FLOP do programa;)
Se esse não for um sinal preciso, você ainda pode usá-lo em um intervalo apropriado e, em seguida, apenas aumentar o sinal, armazená-lo como um número inteiro e, em alguns casos, reduzir o resultado ao intervalo adequado.
Para mul/add de tamanho apropriado, o uso de números inteiros será muito mais rápido e potencialmente exigirá muito menos memória - você também pode aplicar instruções SIMD a eles.
Além disso - melhorar a localidade do cache, minimizar ramificações e minimizar alocações dinâmicas também pode tornar o programa algumas vezes mais rápido.