Перемножение матриц - это простая вещь с точки зрения алгоритмической реализации? И вообще, практически вся линейная алгебра.
А Вы попробуйте написать высокопроизводительный код для этой (или любой другой) операции и увидите, сложно это или просто. Только без использования готовых вручную оптимизированных библиотек на ассемблере. И попытайтесь получить близкую к пиковой скорость, ага.
Уверяю, все те советы из 15-й главы просмотренной мною книги — это лишь самая простая половина от необходимого. Про ассоциативность кэша там что-то сказано? Будет у Вас больше 8-ми выравненных объектов в L1/L2 (или 2-4 в L3 при многопоточности), как все и везде советуют (и в основном правильно) — и помашите ручкой высокой скорости выполнения. Про константы в памяти вместо регистров уже говорил.
Ну и если вам так важна линейная алгебра, то не парьтесь с изучением ассемблера и архитектуры процессора и берите готовые библиотеки, там уже всё грамотно оптимизировано.
А вот например максимально быстро сотни миллионов раз сложить два числа по миллиарду цифр в десятичном виде (не двоичных!) ... Такого никому не нужно и почти никто не занимался. И кстати это хороший пример, те люди писали как раз на С с инстриктами (вашими SIMD функциями), у меня вручную написанный код на асме оказался
вдвое быстрее на той же аппаратуре, хотя по принципу построения весьма схож (а процентов на 70 и просто совпадает), но "дьявол в деталях" как обычно. А ведь эта задача считалась лет 10 непрерывно (не мной) ...