Pull to refresh
98
27.1
Ермолаев Игорь @ErmIg

Пользователь

Send message

А нет ли смысла (и возможно ли) использовать и то и другое одновременно?

Я первым делом померял производительность AVX512_BF16 на Sapphire Rapids. Может я его не правильно использовал, но получилось, что он работает в 2 раза медленнее обычного AVX512. По сути бесполезен. Я так огорчился, что даже выпилил весь код с ним из Simd.

Да, для самообразования (и образования других) работа отличная. Но стоит посмотреть, сколько ещё могут выжать профессионалы (всё таки нюансов там много, скажем даже при обычном умножении матриц на SSE/AVX/AVX512 кроме обычного кеша надо думать ещё про TLB).

Смотрю разное, изучаю. Если будут какие нюансы обнаружены, добавлю в статью.

Пока писал статью, нашел нюансы позволяющие выжать дополнительные 20% :)

Тут такое дело, что AVX512_BF16 отдельно от AMX достаточно редко встречается (в Cooper Lake есть, в следующем поколении Ice Lake его уже нет). Но в целом с замечанием согласен.

С oneDNN пока не сравнивал. Было желание самому разобраться с тем как это работает.

10 см пучка в диаметре я лично не видел :) - это у очень мощных лазеров, таких в нашей лаборатории не было. Но вообще диаметр пучка ограничивается диаметром активной зоны и диаметром зеркала резонатора. Других причин нет.

Не совсем так. Дифракционное рассеяние лазерного пучка (угловое расхождение) обратно пропорционально диаметру пучка: ~(длина волны) / (диаметр пучка). А расстояние на котором лазерный пучок расходится в двое ~(диаметр пучка)^2 / (длина волны). 1 мм лазерный луч расходится на расстоянии 1 м, а 10 см на расстоянии -10 км.

Да к стати. Недавно нужно было реализовать быструю SIMD версию функций cos() и sin().

Использовал полиномы Чебышева. Если кому интересно: версии SSE/AVX/AVX-512 : https://github.com/ermig1979/Simd/blob/master/src/Simd/SimdTrigonometric.h

Хоть картошка и не теплокровная, но вполне себе живая и дышит. И выделяет тепло, особенно при гниении.

Действительно: E=q*U=m*V^2/2 => V = Sqrt(q*U * 2 / m ), Скорость истечения обратно пропорциональна корню молярной массы вещества. Однако изменение импульса P = V*m = Sqrt(E * 2 * m ) уже пропорционально корню молярной массы при заданной энергии. Так как все современные ионные двигатели ограничены в основном со стороны источников питания, то естественно, что в качестве рабочего тела логично использовать наиболее тяжелые ионы для создания наибольшей тяги.

Как бы существует большая разница между прототипом распознавания какой-либо ситуации или объекта при помощи нейросети, которое сейчас достаточно легко на коленке реализуется любым студентом и законченным продуктом, когда задача дожна быть решена с заданной точностью и эффективностью.

Спасибо за статью. Я бы добавил небольшой раздел про то, как определить наличие этого самого расширения AVX-512VBMI (далеко не каждый сервер его поддерживает, не говоря уже про десктоп). А так же что, делать если такого расширения нет.

Если кому интересно, то с 18 года разрабатываю фреймворк для запуска обученных нейронных сетей на CPU:

https://github.com/ermig1979/Synet

Он ориентирован в основном на однопоточную производительность и оптимизирован под основные процессорные расширения (SSE, AVX, AVX-512, AMX, NEON) (по этому направлению опережает OpenVINO). Он поддерживает конвертацию из формата ONNX и OpenVINO. А также динамическую квантизацию моделей.

Как раскрутить астероид для создания искусственной гравитации и не разрушить его, с учетом того, что они по большей части представляют собой слабосвязанную кучу камней?

Красивая математика, но в реальных алгоритмах не взлетит, как и алгоритм Штрассена впрочем.

Как мне кажется задача упирается прежде всего в пропускную способнось памяти, а не в вычислительные возможности процессора. Intel Core i7-9700K имеет теоретическую производительность 50 GFLOPS на ядро (FP64) для FMA. В вашем цикле порядка 10 операций умножения и сложения. Значит теоретически он может выполняться раз в 10 быстрее (~500 мс). Все упирается в пропускную способность памяти, а не в векторизацию и т.п. Это к стати ответ, почему Эльбрус почти догнал гораздо более высокочастоный Intel и Power.

Посмотрел. У них все выглядит гораздо продуманней: аппарат и легче и безопаснее (для пилота).

Зависит от задачи. Но если суммировать порядка 10^6 чисел, то легко получить погрешность во 2-3 знаке. Причем результат будет различасться в зависимости от того, что используешь: Scalar/SSE/AVX/AVX-512 (см подробнее здесь). Впрочем чем больше длина вектора, тем погрешность меньше.

Ну таких опций компилятора наверное еще не придумали. Я лично этот метод руками писал для нахождения суммы разностей квадратов на fp32 (вот пример на SSE см SquaredDifferenceKahanSum32f ).

Код на x87 скалярный, 80-bit регистры загружаются по невыровненному адресу за несколько тактов. Единственное возможное преимущество - повышенная точность, но ее можно достичь другими методами (например см метод Кэхена). Если оставаться в рамках стандартных 64-bit, то можно задействовать SSE, AVX, AVX-512. Это легко перекроет выгоду от x87 даже с учетом более медленного алгоритма.

Касательно оптимизации загрузки NEON векторов, я бы еще посмотрел в сторону выровненной загрузки и использования префетча:

#define PREFECH_SIZE 384

        template <bool align> inline uint8x16_t Load(const uint8_t * p);

        template <> inline uint8x16_t Load<false>(const uint8_t * p)
        {
#if defined(__GNUC__) && PREFECH_SIZE
            __builtin_prefetch(p + PREFECH_SIZE);
#endif
            return vld1q_u8(p);
        }

        template <> inline uint8x16_t Load<true>(const uint8_t * p)
        {
#if defined(__GNUC__)
#if PREFECH_SIZE
            __builtin_prefetch(p + PREFECH_SIZE);
#endif
            uint8_t * _p = (uint8_t *)__builtin_assume_aligned(p, 16);
            return vld1q_u8(_p);
#elif defined(_MSC_VER)
            return vld1q_u8_ex(p, 128);
#else
            return vld1q_u8(p);
#endif
        }

В некоторых случаях помогает (величиной PREFECH_SIZE лучше поиграться).
Чтобы что-то отправить из архива, нужно его прежде туда сохранить. Если интересуют редко встречающиеся ситуации, которые плохо распознаются, то боюсь придется сохранять очень много — т.к. порог на срабатывание нужно будет сильно занижать.
Небольшое замечание по поводу AVX2 версии:
Есть такая замечательная инструкция VPSHUFB (_mm256_shuffle_epi8, Avx2.Shuffle), которая может использоваться в качестве lookup таблицы из 16 одно байтовых значений.
Этой операцией можно заменить почти все битовые операции во втором цикле.
1
23 ...

Information

Rating
212-th
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity