Таким образом, очевидным способом транспонирования матрицы является использование:
for( int i = 0; i < n; i++ )
for( int j = 0; j < n; j++ )
destination[j+i*n] = source[i+j*n];
но я хочу что-то, что позволит использовать локальность и блокировку кеша. Я искал его и не могу найти код, который бы это сделал, но мне сказали, что это будет очень простая модификация оригинала. Есть идеи?
Изменить: у меня есть матрица 2000x2000, и я хочу знать, как изменить код с помощью двух циклов for
, в основном разбивая матрицу на блоки, которые я переношу отдельно, скажем, 2x2 блоков или 40x40 блоков, и см. размер блока которого наиболее эффективен.
Edit2: Матрицы хранятся в главном порядке столбца, то есть для матрицы
a1 a2
a3 a4
хранится как a1 a3 a2 a4
.