• Ускоряем умножение матриц float 4x4 с помощью SIMD
    +3
    Очень разумный вопрос. Статья по факту представляет чистый положительный опыт. Если собрать весь отрицательный, то она будет минимум в 3 раза больше. Конечно dpps я пробовал когда то. Не оправдала от слова совсем.

    Когда SSE4.1 только рекламировали, я уже надеялся, что такая классная инструкция dpps всё упростит. И ждал. Но увы…

    1. Она дорогая: 2 такта (и судя по всему не параллелится как mulps), то есть даже без учёта транспонирования, их надо 16 по 2 такта, получается 32!!! (IACA согласна)
    1.1 dpps — 4 умножения, 3 сложения
    1.2 mulps — 4 умножения, параллелится, это 8 умножений за такт, 16 за два такта, или, грубо, 8 умножений + 3 сложения за 2.5 такта
    2. Одну матрицу надо предварительно трансформировать: dpps(строка M, столбец N)
    3.1 дополнительная инструкция movss для извлечения результата и работа с памятью на уровне 1-го float
    ИЛИ
    3.2 дополнительный код для компоновки результата из 4 float в одном xmm

    Не стоит думать об инструкции, как вещи в себе. Инструкции нужны данные, они должны быть в нужном представлении как на входе, так и на выходе.

    По совокупности факторов её даже Intel не использует в своих примерах матричного умножения.
  • Ускоряем умножение матриц float 4x4 с помощью SIMD
    0
    Спасибо за информацию. Тем более прав был old_bear, когда настаивал на замерах времени: habr.com/post/418247/#comment_18921601.
  • Ускоряем умножение матриц float 4x4 с помощью SIMD
    0
    4096x4096 это по сути 4k экран. Тут уже SIMD + MT (multithreading). А у меня речь про чистый SIMD пока. А сама по себе задача интересная.
  • Ускоряем умножение матриц float 4x4 с помощью SIMD
    0
    Спасибо!!! Как проглядел непонятно. Исправлю.
  • Ускоряем умножение матриц float 4x4 с помощью SIMD
    +5
    1. Да, верю. По опыту. Результаты как минимум коррелируют. Ну будут у меня цифры немного другие, сути это не меняет. А IACA разбирается в архитектуре Intel лучше меня уж точно.
    2. Про реальный мир вы зря: я давно уже использую SIMD и тестирую и так, и так. Тут решил обойтись.
    3. Не могу протестировать всё. У меня максимум AVX (i7-3770).
    4. Это будет синтетика. Я уже отмечал, что тысячами матрицы я не умножаю.
    5. Однако вы правы: пункт 4 имеет место быть, но IACA не может учитывать реальную работу с данными, памятью. Поэтому стоит написать. Интересно будет не только вам.
  • Ускоряем умножение матриц float 4x4 с помощью SIMD
    +4
    Конечно. Пока посмотреть можно тут: www.youtube.com/watch?v=gBp1PoWzeO8
    Сначала писал статью. Потом понял, что одна не получится. Потом понял, что сразу всё писать сложно. Эта статья как раз вышла из неё. Решил посмотреть как пойдёт и будет ли интерес.
    Если кратко, то: Quake2 1600x1200, MT (multythreaded), SSE3, i7-3770, 30 fps.
    Переделываю с нуля под AVX. Цикл статьей планируется по SSE варианту.
  • Ускоряем умножение матриц float 4x4 с помощью SIMD
    0
    Согласен. Пока набираюсь опыта. Собираю пожелания.