Я новичок в оптимизации кода с помощью инструкций 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 для невыровненной памяти, поскольку я не могу гарантировать, что каждая память, переданная этой функции, будет выровнена. И использование встроенных функций для загрузки данных из невыровненной памяти в регистры SSE кажется ужасно медленным (даже медленнее, чем обычный код C).
Заранее спасибо...
a[i] = foo(b[i])
), выполните потенциально невыровненный первый вектор, а затем основной цикл, начиная с первой границы выравнивания после первого вектора, затем последний вектор, который заканчивается последним элементом. Если массив на самом деле был смещен и / или счетчик не был кратен ширине вектора, тогда некоторые из этих векторов будут перекрываться, но это все равно лучше скалярного. - person Peter Cordes   schedule 23.08.2017