Цитата:
без него высокопроизводительной библиотеки не получится. При написании таковой необходимо учитывать и особенности процессоров: на одних эффективным будет один код, а на других - совсем другой.
Здесь вы абсолютно правы. Учитывать осообенности процессоров конечно нужно. Но почти все современные процессоры поддерживают векторизацию вычислений. Это должно быть использовано при написании алгоритма умножения. Самый внутренний цикл матричного умножения должен быть написан на Ассемблере с учетом векторизации (SSE2,SSE3 и.т.д.). При этом нужно использовать все доступные xmm регистры. И использовать многократно данные загруженые в регистры - т.е. минимизировать обмен данными между кэшем и регистрами - блокирование региистров. С этим я разобрался.
Цитата:
Поверьте, задача умножения матриц имеет множество подводных камней, с которыми не справиться и очень опытному программисту. Мой Вам совет: возьмитесь пока за задачу попроще.
Я и так потратил уже много времени на эту задачу. Не хочу отступать на пол пути.
Вопрос остается с блокированием кэша - как выбирать оптимальные размеры блоков. Ещё также нужно учитывать не только кэш данных но и TLB кэш. Т.к промахи в TLB дороже промахов в кэше данных.
Впринципе все ответы на мои вопросы есть в статье K. Goto 'Anatomy of High-Performance Matrix Multiplication'.
Я хочу написать алгоритм, который бы считывал парамерты процессора: размер кешей L1,L2, размер TLB, поддерживаемые инструкции и.т.д. На основе их выбирал из нескольких вариантов умножения наиболее подходящий для этого процессора. В своей статье, Goto подробно описывает как выбирать оптимальные параметры. Именно по этим рекомендациям я написал код. Но достичь производительности которую дает DGEMM из GotoBlas у меня не получается.