这是一小段经常被调用的代码,也是我正在尝试优化的卷积算法的一部分(从技术上讲,这是我的第一次优化,我已经将速度提高了 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 返回)。
该函数有效地返回多维索引中“前导”零的数量,并且旨在避免在每次增量时都需要完全转换为数组索引。
我可以用这个功能做些什么来让它天生更快?有没有一种巧妙的避免方法%
,或者另一种计算“角落排名”的方法 - 如果它有一个我不知道的更正式的名称,请道歉。. .