会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
核心思路
先把每个激活值截到 [−C,C],记截断后的最大绝对值为 M。Q=2B−1−1。M=0 时答案全是 0。否则 ri=zi⋅Q/M 按实数除法计算,再按绝对值做远离零的舍入:小数部分小于 0.5 直接丢掉,大于等于 0.5 向绝对值更大的一侧进 1,最后夹回 [−Q,Q]。
实现方法
对每个 xi 得到 zi,同时求出 M。M=0 就输出 n 个 0。否则对 zi=0,令 num=∣zi∣⋅Q,商为 num/M。若 2(nummodM)≥M,说明小数部分大于等于 0.5,商加 1。再乘回符号,并夹到 [−Q,Q]。用整数余数判断,避免浮点把恰好 0.5 判偏。乘积不超过 106×127,放进 64 位整数即可。
题目内容
在模型部署中,需要将 n 个整数激活值量化为低比特整数。给定量化比特宽度 B 和截断阈值 C,按照以下三个步骤依次处理,前一步的结果作为后一步的输入。
- 截断:
zi=min(C,max(−C,xi))
- 量化范围:
Q=2B−1−1
M=max(∣z1∣,∣z2∣,…,∣zn∣)
若 M=0,则所有量化结果均为 qi=0,无需执行第 3 步。
- 量化。对每个 i,先计算:
ri=zi⋅Q/M
其中,除法按实数计算。然后按照以下规则,将 ri 舍入为整数 qi:
- 设 a=∣ri∣。若 a 的小数部分小于 0.5,则直接舍去小数部分;若小数部分大于或等于 0.5,则将其整数部分加 1。最后恢复 ri 的符号,即小数部分恰好为 0.5 时,向远离 0 的方向舍入。当 ri=0 时,qi=0。
- 将 qi 限制在 [−Q,Q] 范围内:若 qi>Q,则令 qi=Q;若 qi<−Q,则令 qi=−Q。
输入描述
第一行包含三个整数 n、B、C,相邻整数之间用空格分隔。
第二行包含 n 个整数 x1,x2,…,xn,相邻整数之间用空格分隔。
约束
- 1≤n≤1000
- 2≤B≤8
- 1≤C≤106
- ∣xi∣≤106
输出描述
输出一行,包含 n 个整数 q1,q2,…,qn。相邻两个整数之间恰好用一个空格分隔,行末没有多余空格。
样例1
输入
4 3 5
10 -2 0 4
输出
3 -1 0 2
说明
B=3,Q=22−1=3。
截断后得到 z1=5,z2=−2,z3=0,z4=4,其中 x1=10 被截断为 5。因此 M=5。
r1=5⋅3/5=3,q1=3。
r2=−2⋅3/5=−1.2,绝对值的小数部分为 0.2,舍去小数部分后得到 q2=−1。
r3=0,q3=0。
r4=4⋅3/5=2.4,绝对值的小数部分为 0.4,舍去小数部分后得到 q4=2。
四个量化结果均在 [−Q,Q] 范围内,无需进一步调整。
样例2
输入
3 2 10
1 -1 2
输出
1 -1 1
说明
B=2,Q=21−1=1。三个激活值均在 [−10,10] 范围内,无需截断,因此 M=2。
r1=1⋅1/2=0.5,小数部分恰好为 0.5,向远离 0 的方向舍入,得到 q1=1。
r2=−1⋅1/2=−0.5,同样向远离 0 的方向舍入,得到 q2=−1。
r3=2⋅1/2=1,q3=1。
三个量化结果均在 [−Q,Q] 范围内,无需进一步调整。