Vorrei sapere se sto rompendo le rigide regole di aliasing con questo snippet. (Credo di sì dal momento che è un dereferenziazione-pointer punned, ma è fatto in una sola espressione e/parete non piange.)Sto violando rigide regole di aliasing?
inline double plop() const // member function
{
__m128d x = _mm_load_pd(v);
... // some stuff
return *(reinterpret_cast<double*>(&x)); // return the lower double in xmm reg referred to by x.
}
Se sì, qual è la soluzione? Usare simultaneamente diverse rappresentazioni sta diventando hardcore una volta che si desidera rispettare le specifiche.
Grazie per le vostre risposte, sto perdendo il mio buon umore cercando di trovare una soluzione.
risposte che non saranno accettate e perché:
"uso mm_store" -> L'ottimizzatore non riesce a rimuoverlo se le seguenti istruzioni richiedono un registro XMM così si genera un carico poco dopo. Store + caricare per niente.
"use a union" -> Violazione della regola di aliasing se si utilizzano i due tipi per lo stesso oggetto. Se ho capito bene l'articolo scritto da Thiago Macieira.
Che dire di semplice vecchia 'memcpy' in un' double'? – Praetorian
È quasi impossibile evitare l'aliasing quando si ha a che fare con SIMD. Idealmente eviti di accedere a singoli elementi come lo sei ora, ma se ne hai assolutamente bisogno, ti consiglio un sindacato per le cose in pila e un cast di puntatori per i puntatori provenienti dai parametri. La punzonatura di tipo unionista è esplicitamente consentita in C99, e tutti i compilatori mainstream lo porteranno anche in C++. Cercare di essere completamente conformi agli standard quando si ha a che fare con un'estensione non standard è in una certa misura contraddittoria in primo luogo. – Mysticial
@Praetorian: non usa simd intrinsics e chiama memcpy in modo paradossale? ^^ – ThiSpawn