Frage

Ich frage mich, ob es möglich ist, SSE zu verwenden (1,2,3,4, ...) die folgende Schleife zu optimieren:

// u and v are allocated through new double[size*size]
for (int j = l; j < size-1; ++j)
{
    for (int k = 1; k < size-1; ++k)
    {
        v[j*size + k] = (u[j*size + k-1] + u[j*size + k+1] 
                       + u[(j-1)*size + k]+ u[(j+1)*size + k]) / 4.0;
    }
}

Das [j*size + k] Idiom verwendet wird, um den Speicherblock zu behandeln, als ob es ein mehrdimensionales Array war.

Leider ist die -ftree-vectorize Flagge für GCC (4.5) glaubt nicht, dass die Schleife zu SIMD-Typ-Optimierung zugänglich ist. (Obwohl sagen, dass ich noch nie -ftree-vectorize optimize alles andere als die banalsten von Schleifen zu sehen.)

Während ich bin mir bewusst, dass es viele andere Möglichkeiten, um die Leistung der Schleife (OpenMP, Abrollen, in-Place-Algorithmen, usw.) Ich bin speziell zu wissen, interessiert zu verbessern, wenn SIMD verwendet werden kann. Ich bin vielleicht daran interessiert, mehr in der allgemeinen Überblick, wie sich (wenn überhaupt) eine solche Schleife umgewandelt werden könnte, wie es zu einer konkreten Implementierung gegenüber.

War es hilfreich?

Lösung

Es sieht aus wie es möglich sein sollte, aber da (a) Sie verwenden verdoppelt, (b) Sie tun sehr wenig Berechnung in Bezug auf I / O, (c) die meisten modernen x86-64-CPUs verfügen über zwei FPU wie auch immer, dann bekommt man nicht viel Rendite Ihrer SIMD Codierung Investition.

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