0.97857206 即衰减因子
第n项等于 (0.97857206^n)<<32 乘以 2^32 是为了在计算过程中避免浮点运算
static const u32 runnable_avg_yN_inv[] __maybe_unused = {
0xffffffff, 0xfa83b2da, 0xf5257d14, 0xefe4b99a, 0xeac0c6e6, 0xe5b906e6,
0xe0ccdeeb, 0xdbfbb796, 0xd744fcc9, 0xd2a81d91, 0xce248c14, 0xc9b9bd85,
0xc5672a10, 0xc12c4cc9, 0xbd08a39e, 0xb8fbaf46, 0xb504f333, 0xb123f581,
0xad583ee9, 0xa9a15ab4, 0xa5fed6a9, 0xa2704302, 0x9ef5325f, 0x9b8d39b9,
0x9837f050, 0x94f4efa8, 0x91c3d373, 0x8ea4398a, 0x8b95c1e3, 0x88980e80,
0x85aac367, 0x82cd8698,
};
static u64 decay_load(u64 val, u64 n)
{
unsigned int local_n;
当时间经过2016个周期后,衰减后的值为0。即 val*y^n=0, n > 2016
if (unlikely(n > LOAD_AVG_PERIOD * 63))
return 0;
/* after bounds checking we can collapse to 32-bit */
local_n = n;
/*
* As y^PERIOD = 1/2, we can combine
* y^n = 1/2^(n/PERIOD) * y^(n%PERIOD)
* With a look-up table which covers y^n (n<PERIOD)
*
* To achieve constant time decay_load.
*/
当n大于等于32的时候,展开:
前提条件 y^32=1/2 32*(n/32)=n-n%32
n=32*(n/32)+n%32
y^n=y^(32*(n/32)+n%32)=(y^32)^(n/32)*y^(n%32)=(1/2)^(n/32)*y^(n%32)
y^n*2^32=(1/2)^(n/32)*y^(n%32)*2^32=(1/2)^(n/32)*runnable_avg_yN_inv[n%32]
==(2>>(n/32))*runnable_avg_yN_inv[n%32]
if (unlikely(local_n >= LOAD_AVG_PERIOD)) {
val >>= local_n / LOAD_AVG_PERIOD;
local_n %= LOAD_AVG_PERIOD;
}
val = mul_u64_u32_shr(val, runnable_avg_yN_inv[local_n], 32);
return val;
}
decay_load 函数注释
于 2023-09-16 14:49:50 首次发布
文章描述了一个关于计算效率提升的方法,通过将大数值的衰减计算转换为32位操作,使用look-uptable来处理小于PERIOD周期的指数运算,以实现常数时间复杂度的`decay_load`函数。
摘要由CSDN通过智能技术生成