Ich frage mich, ob es einen Compiler (gcc
, xlc
, etc.) auf Power8, die OpenMP SIMD Konstrukte auf Power8 unterstützt? Ich habe versucht mit XL (13.1), aber ich konnte nicht erfolgreich kompilieren. Wahrscheinlich unterstützt es noch nicht simd construct.OpenMP SIMD on Power8
Ich könnte mit gcc 4.9.1 kompilieren (mit diesen Flags -fopenmp -fopenmp-simd
und -O1
). Ich lege Unterschiede zwischen 2 Asm-Dateien.
Kann ich sagen, dass gcc 4.9 in der Lage ist, altivec-Code zu generieren? Um mehr zu optimieren, was soll ich tun? (Ich habe versucht, mit -O3
, beschränken Behandlung)
Mein Code ist sehr einfach:
int *x, *y, *z;
x = (int*) malloc(n * sizeof(int));
y = (int*) malloc(n * sizeof(int));
z = (int*) malloc(n * sizeof(int));
#pragma omp simd
for(i = 0; i < N; ++i)
z[i] = a * x[i] + y[i];
Und generierte Assembly hier ist
.L7:
lwz 9,124(31)
extsw 9,9
std 9,104(31)
lfd 0,104(31)
stfd 0,104(31)
ld 8,104(31)
sldi 9,8,2
ld 10,152(31)
add 9,10,9
lwz 10,124(31)
extsw 10,10
std 10,104(31)
lfd 0,104(31)
stfd 0,104(31)
ld 7,104(31)
sldi 10,7,2
ld 8,136(31)
add 10,8,10
lwz 10,0(10)
extsw 10,10
lwz 8,132(31)
mullw 10,8,10
extsw 8,10
lwz 10,124(31)
extsw 10,10
std 10,104(31)
lfd 0,104(31)
stfd 0,104(31)
ld 7,104(31)
sldi 10,7,2
ld 7,144(31)
add 10,7,10
lwz 10,0(10)
extsw 10,10
add 10,8,10
extsw 10,10
stw 10,0(9)
lwz 9,124(31)
addi 9,9,1
stw 9,124(31)
GCC mit -O1 -fopenmp-simd
.L7:
lwz 9,108(31)
mtvsrwa 0,9
mfvsrd 8,0
sldi 9,8,2
ld 10,136(31)
add 9,10,9
lwz 10,108(31)
mtvsrwa 0,10
mfvsrd 7,0
sldi 10,7,2
ld 8,120(31)
add 10,8,10
lwz 10,0(10)
extsw 10,10
lwz 8,116(31)
mullw 10,8,10
extsw 8,10
lwz 10,108(31)
mtvsrwa 0,10
mfvsrd 7,0
sldi 10,7,2
ld 7,128(31)
add 10,7,10
lwz 10,0(10)
extsw 10,10
add 10,8,10
extsw 10,10
stw 10,0(9)
lwz 9,108(31)
addi 9,9,1
stw 9,108(31)
Um um Details zu klären und zu verstehen, habe ich noch eine Anwendung n das ist n^2 nBody-Anwendung. Diesmal steht meine Frage im Zusammenhang mit diesen Compilern (gcc 4.9 und XL 13.1) und Architekturen (Intel und Power).
Ich habe alle Codes in Kern https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-input-c (Vollversion von Eingabecode input.c)
- Power8 & XLC - Es sagt „nicht vektorisiert wurde SIMD weil es Funktionsaufrufe enthält. (Es gibt sqrtf) ". Es ist vernünftig. Aber in der Asm-Code kann ich sehen, xsnmsubmdp ist es normal? (die assembly: https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-power8-xlc-noinnersimd-asm)
- Power8 & gcc ich versuchte, es in 2 Möglichkeiten zu kompilieren (mit OMP SIMD-Konstrukt und ohne). Es hat meinen asm-Code geändert, ist das normal? (Nach OpenMP, sollte der Code nicht Funktionsaufruf enthält) (Assembilies: https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-power8-gcc-noinnersimd-asm & https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-power8-gcc-innersimd-asm)
- i74820K & gcc Ich habe einen gleichen Test mit omp SIMD und ohne sie. Die Ausgabecodes sind ebenfalls unterschiedlich. Führt FMA diesen Codeblock aus? (Assembilies: https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-i74820k-gcc-noinnersimd-asm & https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-i74820k-gcc-innersimd-asm)
Vielen Dank im Voraus
Das OpenMP 'simd'-Konstrukt ist Teil von OpenMP 4.0 und wird daher von GCC 4.9 und höher unterstützt. XL C 13.1.0 bietet teilweise Unterstützung. –
@HristoIliev danke für die schnelle Antwort. Ich stelle mehr Details in Frage. – grypp
Sorry, ich verstehe Power ISA nicht. Stellen Sie sicher, dass der Compiler darauf hingewiesen wird, dass sich 'x',' y' und 'z' nicht gegenseitig aliasieren können. Andernfalls könnte der Compiler den Code nicht vektorisieren. Sie könnten den Zeigern entweder die 'restrict'-Behandlung geben oder ein Compiler-spezifisches Pragma anwenden, das den Compiler anweist, dass die innerhalb der Schleife dereferenzierten Zeiger sich nicht gegenseitig aliasieren können. Möglicherweise müssen Sie auch den Compiler darauf hinweisen, dass die Speicherzuweisung vier Wort-ausgerichtet ist. –