Здравствуйте, Danchik, Вы писали: D>Я профан в интрсинках, просто в глаза бросается отсутствие else. Так задумано?
Да, конечно. В случае else у нас просто провал векторизации.
Векторизация сделана, повторюсь, достаточно тупо. Она проверяет возможность выполнить всё вычисление ядра одной длиной вектора (в терминах элементов).
И для поиска подходящего размера вектора перебирает всё начиная с максимального — то есть смотрим 32 элемента; 16; 8; 4; 2.
Скажем, если мы складываем int, int, и double, то первую половину можно сделать по 8 элементов за раз. Но тогда мы упрёмся в то, что нет операции "загрузить 8 double в регистр", поэтому 8 не подходит.
Для векторов размером 4 есть возможность зачитать Vector128<int> (SSE) и сложить их (SSE2). Если нету AVX и выше, то на этом всё, и 4 как длина вектора тоже не подойдёт.
А вот если есть AVX, то можно загрузить Vector256<double>, а также сконвертировать результат целого сложения в double, что даёт нам успех на длине вектора = 4.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.