Spesso sono costretto a scrivere due implementazioni di funzione che utilizza le istruzioni SSE a causa buffer di input e output possono essere allineati o meno gli indirizzi allineati:Caricamento e archiviazione allineati e non allineati dei vettori SSE: come ridurre la duplicazione del codice?
void some_function_aligned(const float * src, size_t size, float * dst)
{
for(size_t i = 0; i < size; i += 4)
{
__m128 a = _mm_load_ps(src + i);
// do something...
_mm_store_ps(dst + i, a);
}
}
e
void some_function_unaligned(const float * src, size_t size, float * dst)
{
for(size_t i = 0; i < size; i += 4)
{
__m128 a = _mm_loadu_ps(src + i);
// do something...
_mm_storeu_ps(dst + i, a);
}
}
e non v'è una domanda: Come ridurre la duplicazione del codice, perché queste funzioni sono quasi uguali?
Non preoccuparti di allineamento processori più recenti. Dopo che l'allineamento della serie nehalem (i serie) ha meno impatto rispetto a prima e utilizzando le istruzioni non allineate con dati allineati non ha penalità. Ad esempio MSVC 2013 non emetterà le istruzioni allineate (anche se si utilizza l'intrinseco allineato) – Mgetz
Lo so, ma ci sono CPU più vecchie di Nehalem. E sono costretto a supportarli nel mio codice. –