これは非常に頻繁に呼び出されるコードの小さな断片であり、最適化しようとしている畳み込みアルゴリズムの一部です (技術的には、これは私の最初のパスの最適化であり、速度は既に 2 倍向上していますが、今は立ち往生しています) :
inline int corner_rank( int max_ranks, int *shape, int pos ) {
int i;
int corners = 0;
for ( i = 0; i < max_ranks; i++ ) {
if ( pos % shape[i] ) break;
pos /= shape[i];
corners++;
}
return corners;
}
このコードはpos
、N 次元配列内の位置のプロパティを計算するために使用されています (ポインターと演算にフラット化されています)。max_ranks
は次元数でshape
、各次元のサイズの配列です。
3 次元配列の例にはmax_ranks = 3
、 、および が含まれる場合がありshape = { 3, 4, 5 }
ます。最初のいくつかの要素の概略レイアウトは次のようになります。
0 1 2 3 4 5 6 7 8
[0,0,0] [1,0,0] [2,0,0] [0,1,0] [1,1,0] [2,1,0] [0,2,0] [1,2,0] [2,2,0]
Returned by function:
3 0 0 1 0 0 1 0 0
最初の行 0..8 は によって与えられるインデックス オフセットを示し、pos
以下の数字は多次元インデックスを示します。編集: その下に、関数によって返される値を配置しました (2 の値は 12、24、および 36 の位置に返されます)。
この関数は、多次元インデックスの「先頭の」ゼロの数を効果的に返し、インクリメントごとに配列インデックスに完全に変換する必要がないように設計されています。
この関数を本質的に高速化するためにできることはありますか? を回避する賢い方法%
、または「コーナー ランク」を計算する別の方法はありますか - ちなみに、私が知らないより正式な名前が付けられている場合は申し訳ありません。. .