Хотел написать себе функцию очистки экрана между рендерингом фреймов. Посчитал, что обычного memcpy мне мало, я ведь не хочу, чтобы он пачкал мне кэш. И вот, что я придумал:
Хочу пользоваться инструкциями, которые пишут мимо кеша (movntdq), группировать их для записи по 64 байта, чтобы был так называемый write combine, и скорость была не хуже, чем и обычного movdqa.
Вроде всё правильно сделал. Компиляем на 3 машинах одним и тем же clang 4.0.0 с флагом -O2
И что мы видим на разных архитектурах?
AMD Bulldozer: В принципе, ожидаемый результат
AMD Piledriver: Вопрос, почему вариант с movntdq такой тормозной тут?
И самая мякотка: Intel Atom Pineview Вариант в обход кэша, ВНЕЗАПНО, в 2 раза быстрее. Вот кто объяснит, ЧЯДНТ? Почему на Piledriver'е такая жопа? Алсо, результаты для других архитектур приветствуются, только по возможности используем тот же компилятор (или хотя бы указываем альтернативу).
Re:Кэп: а ведь все процессоры разные!
интель G3220, компилил ggc-ой (gcc -O2 -msse2 main.c).
memset: 6.919018
fast_zero1: 7.359665
fast_zero2: 12.774364
Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0