Come ridurre al minimo le operazioni del punto flottante nel seguente codice

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

  •  13-11-2019
  •  | 
  •  

Domanda

Devo minimizzare la quantità totale di flop nel codice seguente, qualcuno può fare un occhio veloce e dimmi dove mettere il mio sforzo? Ho provato diversi analizzatori di perfomance, ma i risultati erano irrilevanti ..

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;
}
.

Grazie, Cho

È stato utile?

Soluzione

Destra, non ho letto ogni ultima riga, ma sembra che tu sia semplicemente:

    .
  1. Generazione di interni casuali
  2. memorizzandoli come doubles
  3. aggiungendoli
  4. aggiungendo e moltiplicandoli

    Iow - Non vedo alcun uso della frazione a tutti e un numero intero di dimensioni adeguatamente sarà superiore.Se è vero, puoi rimuovere ogni flop nel programma;)

    Se questo non è un segnale accurato, è comunque possibile utilizzarlo in un intervallo appropriato, quindi in scala il segnale, memorizzare come numero intero, quindi portare il risultato verso il basso fino all'intervallo corretto in alcuni casi. Per il MUL / ADD in modo appropriato, utilizzando numeri interi saranno molto più veloci e potenzialmente richiedono molta meno memoria: è anche possibile applicare le istruzioni SIMD a loro.

    Oltre a ciò - il tuo miglioramento della località della cache, riducendo al minimo la ramificazione e riducendo al minimo le allocazioni dinamiche potrebbe anche rendere il programma un paio di volte più veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top