Я новичок в оптимизации кода с инструкциями SSE/SSE2, и до сих пор я не очень далеко. Насколько мне известно, общая функция, оптимизированная по SSE, будет выглядеть так:
void sse_func(const float* const ptr, int len){
if( ptr is aligned )
{
for( ... ){
// unroll loop by 4 or 2 elements
}
for( ....){
// handle the rest
// (non-optimized code)
}
} else {
for( ....){
// regular C code to handle non-aligned memory
}
}
}
Однако, как правильно определить, указывает ли память ptr
, выравнивается, например. 16 байт? Я думаю, что мне нужно включить обычный C-код для неприсоединившейся памяти, поскольку я не могу убедиться, что каждая память, переданная этой функции, будет выровнена. И использование intrinsics для загрузки данных из неизмененной памяти в регистры SSE кажется ужасным медленным (даже медленнее обычного C-кода).
Спасибо заранее...