2015-06-09 14 views
5

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)

  1. 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)
  2. 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)
  3. 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

+2

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. –

+0

@HristoIliev grazie per la risposta rapida. Metto in discussione più dettagli. – grypp

+0

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. –

risposta

3

Il compilatore XL su POWER Linux attualmente supporta solo un sottoinsieme delle funzionalità di OpenMP 4.0. La funzione di costruzione SIMD non è supportata al momento, quindi il compilatore non riconoscerà il costrutto nel codice sorgente.

Tuttavia, se vettorializzazione è quello che stai cercando poi la buona notizia è che il compilatore XL dovrebbe vettorizzare già automaticamente il codice fino a quando si utilizzano le opzioni almeno i seguenti elementi di ottimizzazione

-O3 - qhot -qarch = pwr8 -qtune = pwr8

Queste opzioni consentiranno high-order loop transformations insieme con le ottimizzazioni specifiche Power8, tra cui ciclo di auto-vettorizzazione per il vostro ciclo.

In seguito, si dovrebbe vedere alcuni VMX & istruzioni VSX nel codice assembly generato simile al seguente:

188: 19 2e 80 7c  lxvw4x vs36,0,r5 
18c: 84 09 a6 10  vslw v5,v6,v1 
190: 10 00 e7 38  addi r7,r7,16 
194: 10 00 a5 38  addi r5,r5,16 
198: 40 28 63 10  vadduhm v3,v3,v5 
19c: 80 20 63 10  vadduwm v3,v3,v4 
1a0: 19 4f 66 7c  stxvw4x vs35,r6,r9 
1a4: 14 02 86 41  beq  cr1,3b8 <foo+0x3b8> 
1a8: 10 00 20 39  li  r9,16 
1ac: 19 4e 27 7d  lxvw4x vs41,r7,r9 
1b0: 19 3e a0 7c  lxvw4x vs37,0,r7 

Tra l'altro, è anche possibile ottenere un rapporto di ottimizzazione dei compilatori XL utilizzando la -qreport opzione. Questo spiegherà quali circuiti sono stati vettorizzati e quali loop non erano e per quale motivo. per esempio.

1586-542 (I) Loop (indice del ciclo 1 con nido livello 0 e iterazione count 100) in corrispondenza test.c era SIMD vettorializzare.

o

1586-549 (I) Loop (indice del ciclo 2) a test.c non SIMD vettorializzato perché una dipendenza dai dati impedisce SIMD vettorizzazione.

Spero che questo aiuti!

+0

Grazie per la risposta. Ho un'altra domanda relativa al blocco del ciclo di vettorizzazione quando contiene una chiamata di funzione. – grypp

+0

Forse potresti incorporare le informazioni su GCC dal mio post nel tuo e poi eliminerò il mio poiché si trattava più di un commento esteso che di una risposta completa. –

3

non ho accesso ad una macchina di alimentazione a base di questo momento, ma po 'di sperimentazione con il dumper AST su x86 dimostra che GCC 4.9 .2 inizia la produzione di codice SIMD solo una volta il livello di ottimizzazione raggiunge O1, vale a dire le seguenti opzioni dovrebbero fare il trucco:

-fopenmp-simd -O1 

lo stesso vale per il GCC 5.1 .0.

Si noti inoltre che il vectoriser applica un modello di costo che potrebbe impedire di produrre effettivamente codice vettorizzato in alcuni casi. Vedere -fsimd-cost-model e opzioni simili here su come sovrascrivere tale comportamento.

+0

Grazie, ho compilato e visto i cambiamenti. Ma, mi chiedo anche se è abbastanza ottimizzato codice in termini di operazioni di altivec – grypp

+0

Che io non lo so. Ma aumentare il livello di ottimizzazione dovrebbe migliorare ulteriormente le cose. –

+0

Ho risolto questo problema. Ma interessantemente non ho potuto ottenere ottimi risultati dal potere, per ora i7 sembra migliore. Immagino sia perché SSE4 – grypp