Есть возможность реализовать это самостоятельно, возможно, используя std :: valarray, потому что это может быть распараллелено с использованием OpenMP: gcc, безусловно, имеет такую версию, MSVC ++, вероятно, тоже.
В противном случае возможны следующие хитрости: одну из матриц следует транспонировать. Тогда у вас есть:
AB [i, j] = сумма (k) A [i, k] B ^ t [j, k]
где вы сканируете непрерывную память. Если у вас 8 ядер, вы можете довольно легко разделить набор индексов [i, j] на 8 и дать каждому ядру 1/8 от общей работы. Чтобы сделать это еще быстрее, вы можете использовать инструкции умножения вектора, большинство компиляторов предоставляют для этого специальную функцию. Результат будет не таким быстрым, как настроенная библиотека, но все должно быть в порядке.
Если вы выполняете более длительные вычисления, такие как полиномиальная оценка, оценщик потоков, который также имеет поддержку потоков (gak, два вида потоков), будет хорошо работать, даже если он не будет выполнять настройку низкого уровня. Если вы действительно хотите делать что-то быстро, вам нужно использовать правильно настроенную библиотеку, такую как Atlas, но тогда вы, вероятно, не запустите Windows, если вы серьезно относитесь к HPC.