Для этого решил использовать блочный вариант умножения, идея которого состоит в том чтобы загружать блоки матриц в L2 кэш и там их перемножать...т.е. как можно дольше использовать одни и те же загруженные в кэш данные, чтобы минимизировать пересылки между кэшем и ОЗУ. Но у меня удается дочтичь только 50% от пика. Вопрос состоит в том как выбирать оптимальную схему блокирования и размеры блоков, так чтобы достичь пиковой производительности?
Поглядите на проект
ATLAS (Automatically Tuned Linear Algebra Software). Это реализация BLAS и частично LAPACK как раз с учетом размера кэша конкретного процессора. В дистрибутиве есть неплохая документация в pdf.