Re[12]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.10.20 12:36
Оценка:
Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.