Come fare in modo che GCC utilizzi più di due registri SIMD quando si utilizzano intrinseci?
Domanda
Sto scrivendo un po 'di codice e sto provando ad accelerarlo usando SIMD intrinsics SSE2 / 3. Il mio codice è di tale natura che devo caricare alcuni dati in un registro XMM e agire su di esso molte volte. Quando guardo il codice assembler generato, sembra che GCC continui a scaricare nuovamente i dati nella memoria, al fine di ricaricare qualcos'altro in XMM0 e XMM1. Sto compilando per x86-64, quindi ho 15 registri. Perché GCC ne utilizza solo due e cosa posso fare per chiedere di usarne di più? C'è un modo in cui posso " pin " qualche valore in un registro? Ho aggiunto il "registro" parola chiave per la mia definizione variabile, ma il codice assembly generato è identico.
Soluzione
Sì, puoi. Explicit Reg Vars parla della sintassi che devi aggiungere variabile per un registro specifico.
Altri suggerimenti
Se stai arrivando al punto in cui stai specificando i singoli registri per ogni intrinseco, potresti anche semplicemente scrivere la directory dell'assembly, specialmente data la cattiva abitudine di gcc di pessimizzare gli intrinseci inutilmente in molti casi.