Использование кэша при транспонировании матрицы в c

Этот код транспонирует матрицу четырьмя способами. Первый делает последовательную запись, непоследовательное чтение. Второй - наоборот. Следующие два - то же самое, но с пропуском записей в кэш. Похоже, что последовательная запись происходит быстрее, а пропуск кэша - быстрее. Я не понимаю, если кэш пропускается, почему последовательная запись все еще быстрее?

QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
   for (j = 0; j < N; ++j)
      tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 1:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (j = 0; j < N; ++j)
   for (i = 0; i < N; ++i)
     tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 2:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
   for (j = 0; j < N; ++j)
      _mm_stream_si32(&tmp[i][j], mul2[j][i]);
QueryPerformanceCounter(&after);
printf("Transpose 3:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (j = 0; j < N; ++j)
   for (i = 0; i < N; ++i)
      _mm_stream_si32(&tmp[i][j], mul2[j][i]);
QueryPerformanceCounter(&after);
printf("Transpose 4:\t%ld\n", after.QuadPart - before.QuadPart);

EDIT: Вывод:

Transpose 1:    47603
Transpose 2:    92449
Transpose 3:    38340
Transpose 4:    69597
5
задан Dan 12 November 2012 в 15:53
поделиться