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

Foi útil?

Solução

Certo, não li todas as linhas, mas parece que você está simplesmente:

  1. gerando entradas aleatórias
  2. armazenando-os como doubleé
  3. adicionando-os
  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top