Если вы хотите загрузить элементы для выполнения поэлементных операций (и впоследствии сохранить их для того же или другого вектора), простое решение - использовать перекрывающиеся нагрузки / хранилища.
Упрощенный пример ( требуется специальная обработка, если vect.size()<4
)
// load last four elements for later use
__m256d last_input = _mm256_loadu_pd(vect.data()+vect.size()-4);
for(size_t i=0; i<vect.size()-4; i+=4) { // main loop
__m256d input = _mm256_loadu_pd(vect.data()+i);
_mm256_storeu_pd(some_operation(input), output.data()+i);
}
// process and store last elements (possibly overlapping with previous store):
_mm256_storeu_pd(some_operation(last_input, output.data()+vect.size()-4);
Убедитесь, что компилируется с оптимизацией, а в gcc / clang с -march=native
(в противном случае невыровненные загрузки / хранилища могут быть неэффективно разделены).