decay_load 函数注释

文章描述了一个关于计算效率提升的方法,通过将大数值的衰减计算转换为32位操作,使用look-uptable来处理小于PERIOD周期的指数运算,以实现常数时间复杂度的`decay_load`函数。
摘要由CSDN通过智能技术生成
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值