Frage

Ich muss die Gesamtzahl der Flops im folgenden Code minimieren, kann jemand bitte einen kurzen Blick darauf werfen und mir sagen, wo ich mich anstrengen soll?Ich habe mehrere Leistungsanalysatoren ausprobiert, aber die Ergebnisse waren irrelevant..

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

Danke, Cho

War es hilfreich?

Lösung

Richtig, ich habe nicht jede letzte Zeile gelesen, aber es sieht so aus, als ob du einfach bist:

  1. zufällige Ints generieren
  2. speichern Sie sie als doubles
  3. hinzufügen von ihnen
  4. addieren und multiplizieren Sie sie

IOW - Ich sehe keine Verwendung des Bruchs überhaupt, und eine entsprechend große Ganzzahl wird überlegen sein.Wenn das stimmt, können Sie jeden FLOP im Programm entfernen;)

Wenn das kein genaues Signal ist, können Sie es trotzdem in einem geeigneten Bereich verwenden, dann skalieren Sie das Signal einfach hoch, speichern Sie es als Ganzzahl und bringen Sie das Ergebnis in einigen Fällen wieder in den richtigen Bereich.

Bei entsprechend großen mul / add ist die Verwendung von Ganzzahlen viel schneller und erfordert möglicherweise viel weniger Speicher - Sie können ihnen auch SIMD-Anweisungen zuweisen.

Darüber hinaus könnte Ihre Verbesserung der Cache-Lokalität, die Minimierung der Verzweigung und die Minimierung dynamischer Zuweisungen das Programm auch um ein Vielfaches schneller machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top