Schleifenoptimierung durch den IBM xlC Compiler mit Altivec - c ++, Optimierung, Compiler-Konstruktion, Vektorisierung, xlc

Ich habe nur mit dem Altivec gespieltErweiterung auf einem Power6-Cluster, den wir haben. Ich bemerkte, dass, als ich den Code ohne irgendwelche Optimierungen kompilierte, meine Beschleunigung 4 war, wie ich erwartet hatte. Als ich es jedoch erneut mit dem -O3-Flag kompilierte, konnte ich eine Beschleunigung von 60 erreichen!

Ich frage mich, ob jemand mehr Erfahrung damit hatDies ist in der Lage, einige Einblicke zu geben, wie der Compiler meinen Code neu anordnet, um eine solche Beschleunigung durchzuführen. Ist hier die einzige mögliche Optimierung durch Montage und Instruction-Pipelining, oder fehlt mir noch etwas, das ich in meine zukünftige Arbeit einbeziehen kann?

int main(void) {
const int m = 1000;

__vector signed int va;
__vector signed int vb;
__vector signed int vc;
__vector signed int vd;

int a[m];
int b[m];
int c[m];

for( int i=0 ; i < m ; i++ ) {
a[i] = i;
b[i] = i;
c[i] = 0;
}

for( int cnt = 0 ; cnt < 10000000 ; cnt++ ) {
vd = (__vector signed int){cnt,cnt,cnt,cnt};

for( int i = 0 ; i < m/4 ; i+=4 ) {
va = vec_ld(0, &a[i]);
vb = vec_ld(0, &b[i]);
vc = vec_add(vd, vec_add(va,vb));
vec_st(vc, 0, &c[i]);
}
}

std::cout << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "n";

return 0;
}

Antworten:

4 für die Antwort № 1

Ich habe einige Sachen auf Power 7 gemacht, und ich habe sehr seltsame Dinge mit dem XLC-Compiler gesehen. Aber nicht so seltsam wie das! (Nicht 60x mindestens ...)

Bei der PowerPC-Serie (zumindest für Power6 und Power7) ist zu beachten, dass die Befehlslatenzen sehr lang sind und die Out-of-Order-Ausführung im Vergleich zu x86 / x64 sehr schwach ist.

Daher wird die innere Schleife (wie in Ihrem Code geschrieben) extrem niedrige IPC bekommen.

Nun, die einzige Art und Weise, wie ich mir vorstellen kann, 60x schneller zu machen, ist die innere Schleife vollständig abgerollt unter -O3. Dies ist möglich, da die Auslösezahl der inneren Schleife statisch mit 63 bestimmt werden kann.

Durch das Abrollen dieser inneren Schleife wird im Prinzip die gesamte Pipeline gefüllt.

Natürlich rate ich nur. Am besten ist es, sich die Versammlung anzusehen.

Wie timen Sie das? Viel von dem seltsamen Verhalten, das ich auf PowerPC gesehen habe, stammt von den Timern selbst ...

BEARBEITEN:

Da Ihr Beispielcode ziemlich einfach ist, sollte es (in der Baugruppe) sehr leicht zu erkennen sein, ob diese innere Schleife teilweise oder vollständig abgerollt ist.


Verwandte Fragen
Speisekarte