Domanda

È meglio in un certo senso vettorializzare il codice a mano, usando pragmi espliciti o fare affidamento o utilizzare l'auto-vettorializzazione? Per ottenere prestazioni ottimali utilizzando la vettorializzazione automatica, si dovrebbe monitorare l'output del compilatore per assicurarsi che i loop vengano vettorizzati o modificarli fino a renderli vettorializzabili.

Con la codifica manuale, si è certi che vengano emesse le istruzioni desiderate, ma ora il codice probabilmente non è portatile (né per altre architetture o altri compilatori).

È stato utile?

Soluzione

La vettorializzazione automatica non ha mai funzionato bene per me. A me sembra che la vettorializzazione automatica funzioni solo per loop molto banali al momento.

Uso il pragma / approccio intrinseco e guardo l'assemblaggio. Se il compilatore genera un codice errato (come versare registri SSE nello stack o aggiungere mosse ridondanti), uso l'assemblatore in linea per l'intero corpo del ciclo.

La portabilità non è un problema. Spesso si inizia con un ciclo C / C ++ e lo si ottimizza tramite intrinseci. Basta mantenere il vecchio loop e usarlo come unit-test / fallback per l'implementazione SIMD. Inoltre è sempre saggio essere in grado di rimuovere tutto il codice SIMD da un progetto tramite una definizione in fase di compilazione. Il debug di un'applicazione è molto più semplice in questo modo. La stessa definizione può essere utilizzata per la compilazione incrociata.

Altri suggerimenti

Non farei mai affidamento sulla vettorializzazione automatica da qualsiasi compilatore. Con gcc sarei doppiamente diffidente perché gli effetti delle ottimizzazioni di gcc variano sempre da versione a versione. Quasi tutti quelli che conosco che si affidano a ottimizzazioni speciali o estensioni gcc devono fare i conti con la rottura quando viene rilasciata una nuova versione gcc .

Di solito puoi fidarti di pragmi e intrinseci, ma dovresti tenere d'occhio le note di rilascio per le nuove versioni di gcc e dovresti dire ai tuoi utenti quale versione di gcc è necessaria per compilare il tuo codice.

Una o due volte quando la vettorializzazione conta davvero, abbiamo aggiunto qualcosa alla suite di test per chiamare objdump e verificare che le istruzioni vettoriali siano effettivamente utilizzate. Sarebbe bello poter rilevare automaticamente anche il "codice vettoriale errato" (come descrive Nils), ma non siamo mai andati così lontano.

Devo ancora vedere un vettorizzatore automatico che fa più bene che male.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top