В качестве эксперимента я применил алгоритм умножения матриц Штрассена, чтобы увидеть, действительно ли приводит к более быстрому коду для больших n.
https://github.com/wcochran/strassen_multiplier/blob/master/mm.c
К моему удивлению, это было намного быстрее для больших n. Например, для случая n=1024 при использовании обычного метода потребовалось 17,20 секунды, а при использовании метода Штрассена (2x2,66 ГГц Xeon) — всего 1,13 секунды. Что -- 15-кратное ускорение!? Это должно быть лишь незначительно быстрее. В самом деле, это казалось таким же хорошим даже для небольших матриц 32x32!?
Единственное, чем я могу объяснить такое значительное ускорение, это то, что мой алгоритм более удобен для кэширования, т. е. он фокусируется на небольших фрагментах матриц и, следовательно, данные более локализованы. Может быть, мне следует выполнять всю свою матричную арифметику по частям, когда это возможно.
Любые другие теории о том, почему это так быстро?