📓 Записки программера
1.02K subscribers
304 photos
1 video
6 files
599 links
Канал с регулярными постами о разных интересных материалах (статьи, видео, фреймворки и полезные инструменты).

https://dotnet.social/@denisio
加入频道
Ещё один всрато-тест - считаем StdDev.

Разница между обычным LINQ и Vector256 - в разы на маленькой коллекции и два порядка на большой (gist, .net 7)

Для тех кто не понял что делается на примере Average:
* загружается по 4 double в вектор (256 бит / 8 байт (64 бита) один double = 4 штуки влезает в 1 вектор)
* над ними одновременно делается операция Avx.Add - добавляем к вектору-аккумулятору такой же вектор с 4 следующими double (Vector256.Load возвращает вектор со следующими 4 double по адресу pointer)
* после прохода по всем элементами - складываем 4 штуки double из vsum - получаем полную сумму всех элементов
* делим на src.Count - получаем среднее из чего формируем новый вектор vectorMean - он получает 4 идентичных значения в своих элементах.

Аналогичным образом по 4 элемента - делается операция Sum( (p-mean) * (p-mean) )
результат которой потом делится на src.Count и получаем Average.

Если бы операция была над float - можно было бы в 256 бит уложить сразу по 8 float'ов: 256 бит / 4 байта (32 бита) float

#csharp #avx
👍2
Случайно попался неплохой справочник по x86/x64 инструкциям, в т.ч. SSE/AVX, учитывая что документация по AVX расширениям в дотнете прямо таки скажем весьма не очень. Например байт маски в Blend #sse #avx
👍4