Sto cercando di compilare un codice SIMD che funzioni su MSVC con Clang su Xcode 6. Sfortunatamente ricevo un errore in cui gli operatori di accesso agli array sono stati sovraccaricati in una classe vettoriale personalizzata che non riesco a risolvere. Il modello vettoriale ha specializzazioni per array di lunghezza 4 e 8 che usano intrinseche SIMD, ma l'operatore di accesso all'array per restituire un riferimento a un elemento del vettore (per l'aggiornamento di quell'elemento) mi dà un errore su clang "il riferimento non const non può associare all'elemento vettoriale ".Come accedere agli elementi vettoriali SIMD quando si sovraccaricano gli operatori di accesso agli array?
Gli operatori di overload:
#ifdef _MSC_VER
float operator[](int idx) const { return v.m256_f32[idx]; } // m256_f32 MSVC only
float& operator[](int idx) { return v.m256_f32[idx]; }
#else
float operator[](int idx) const { return v[idx]; }
float& operator[](int idx) { return v[idx]; }
#endif
L'errore da Clang:
non-const reference cannot bind to vector element
float& operator[](int idx) { return v[idx]; }
^~~~~~
L'intero motivo dell'utilizzo di simd è la prestazione, quindi non si vuole fare nulla che possa rallentarlo drasticamente! – olilarkin
@olilarkin: certo - ma se si accede a singoli elementi di un vettore all'interno di un ciclo critico delle prestazioni, si sta facendo del tutto sbagliato SIMD, in genere questo tipo di operazione dovrebbe avvenire solo dopo un ciclo, dove non è prestazioni- critica. –
scusa ti ho frainteso ... gli elementi non sono accessibili individualmente nella parte relativa alle prestazioni, solo nell'inizializzazione – olilarkin