다양한 크기의 행렬에 대한 실험을 수행한 후 행렬 전치에 대한 특이한 관찰이 발생했습니다. 차원이 2^인 행렬을 전치하는 것입니다. n은 차원 2^n 1을 전치하는 것보다 계산 비용이 더 많이 듭니다. n이 512일 때 불일치가 커집니다.
전치 연산을 위해 제공되는 코드는 다음과 같습니다.
#define SAMPLES 1000 #define MATSIZE 512 #include <time.h> #include <iostream> int mat[MATSIZE][MATSIZE]; void transpose() { for ( int i = 0 ; i < MATSIZE ; i++ ) for ( int j = 0 ; j < MATSIZE ; j++ ) { int aux = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = aux; } } int main() { //initialize matrix for ( int i = 0 ; i < MATSIZE ; i++ ) for ( int j = 0 ; j < MATSIZE ; j++ ) mat[i][j] = i+j; int t = clock(); for ( int i = 0 ; i < SAMPLES ; i++ ) transpose(); int elapsed = clock() - t; std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES; }
MATSIZE 매크로를 변경하여 행렬의 크기를 수정할 수 있습니다. 다음 벤치마크는 극명한 차이를 보여줍니다.
이러한 변칙의 원인은 다음과 같습니다. 캐시 동작 및 캐시 경합의 개념. 자세한 내용은 다음과 같습니다.
따라서 캐시 경합으로 인해 차원이 2^n의 배수인 행렬의 경우 전치 작업이 상당히 느려집니다.
위 내용은 512x512 행렬을 전치하는 것이 513x513 행렬을 전치하는 것보다 훨씬 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!