さまざまなサイズの行列で実験を行った後に、行列の転置に関する奇妙な観察が生じました。次元 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 中国語 Web サイトの他の関連記事を参照してください。