Mi chiedo se ci sia un compilatore (gcc
, xlc
, ecc.) Su Power8 che supporti i costrutti OpenMP SIMD su Power8? Ho provato con XL (13.1) ma non ho potuto compilare correttamente. Probabilmente non supporta ancora il costrutto simd.OpenMP SIMD su Power8
Potrei compilare con gcc 4.9.1 (con queste bandiere -fopenmp -fopenmp-simd
e -O1
). Metto le differenze tra 2 file asm.
Posso dire che gcc 4.9 è in grado di generare il codice altivec? Per ottimizzare di più, cosa dovrei fare? (Ho provato con -O3
, limitare il trattamento)
Il mio codice è molto semplice:
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];
E assembly generato è qui
.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 con -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)
Al fine per chiarire e capire i dettagli, ho ancora una domanda n che è l'applicazione n^2 nbody. Questa volta la mia domanda è correlata a questi compilatori (gcc 4.9 e XL 13.1) e alle architetture (Intel e Power).
ho messo tutti i codici in Gist https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-input-c (versione completa del codice di ingresso input.c)
- Power8 & XLC - si dice "non è stato SIMD vettorializzare perché contiene chiamate di funzione. (c'è sqrtf) ". È ragionevole Ma nel codice asm posso vedere che xsnmsubmdp è normale? (il gruppo: https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-power8-xlc-noinnersimd-asm)
- Power8 & gcc ho provato a compilare in 2 modi (con omp SIMD costrutto e senza). Ha cambiato il mio codice ASM, è normale? (Secondo OpenMP, il codice non deve contenere chiamata di funzione) (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 ho fatto un stesso test con OMP SIMD e senza di essa. Anche i codici di uscita sono diversi. FMA ha effetto su questo blocco di codice? (Assembilies: https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-i74820k-gcc-noinnersimd-asm & https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-i74820k-gcc-innersimd-asm)
Grazie in anticipo
Il costrutto OpenMP 'simd' fa parte di OpenMP 4.0 e come tale è supportato da GCC 4.9 e successive. XL C 13.1.0 fornisce supporto parziale. –
@HristoIliev grazie per la risposta rapida. Metto in discussione più dettagli. – grypp
Mi spiace, non capisco l'ISA di Power. Assicurati di suggerire al compilatore che 'x',' y' e 'z' non possono alias l'un l'altro. Altrimenti il compilatore potrebbe essere riluttante a vettorializzare il codice. Potresti dare ai puntatori il trattamento "restrict" o applicare un pragma specifico del compilatore che suggerisce al compilatore che i puntatori dereferenziati all'interno del ciclo non possono alias l'un l'altro. Potrebbe anche essere necessario suggerire al compilatore che l'allocazione della memoria è allineata in quad-word. –