是有点直球,却又一直不知道往哪发【但是看看有没有道理吧
我搞软件,但也许算关注面比较广吧【
按个人审美(不知道该用什么词了),有些比较骚的位运算,实现其实花不了几个门(谁敢跟浮点比?),第一眼看起来很好,有经验的程序猿的想想好像用处很少,要做进cpu么还是得犹豫,但是拿再深刻想想实际上要用到的时候没有,然后软件模拟,还会很烦。而随着时代发展,实际上事实证明还是要加入。
直接列表吧:
- 旋转位移:ror rol
- 位逆序:bitrev
- 计算开头结尾0:clz ctz
- 位计数:bitcount/popcount
- 位按mask分散集合存取:pdep pext
- F2多项式乘法/无进位乘法 clmul,密码学算法大大的有用,除此之外还有别的用法【再来点聚合时用and/or的(clmul本身定义是xor嘛),说不定一般用途更广泛
- 再扩展点,大小端转换、nibble交换,或者干脆把“逐2n位分组奇偶交换”统一起来最好,尽管位运算hacking组合起来不慢
- 再稍微远一点,位矩阵转置、翻转(逐2n位分段逆序,或者段间同位逆序),位正反洗牌(交错/反交错),用途可能很少,但我写某些益智游戏搞事的时候,还是都有过需求【说人话的话,什么国际象棋跑分啊,五子棋AI,说不定会用到,图形学也有点用(
- 两个源操作数连接起来,统一右移i位并取低字,或者统一左移i位并取高字。跨字的位串连接操作,虽然可能短字长单片机指令集里更需要,软浮点啥的,64位时代也许需求比较小(但其实这个又可以完全覆盖ror rol了,两个源操作数一样
指令集文档我是看过的,这里就是列个总表,我认为现代指令集这些都该有(欢迎继续推荐你觉得有用的指令)。
都是c语言标准原生没有的。前两者其实至今都用得很少,单片姬多一些,但loong已经加上了,很好。zig讨论:https://github.com/ziglang/zig/issues/7183
中间两行三大金刚:clz ctz popcnt,其实都是近多少年常被讨论,x86也是在(现在看也挺老了的)扩展指令集里才有,c编译器调用方式也不一致,常需要给萌新科普的。我看到loongarch不仅有而且机器码字典序排在很前面,这是好的,感受到了前瞻性。
而再接下来三大金刚:pdep pext clmul,则是我一直想推荐的(之前也在zig那里发了点言,显然是搜到同样有呼声:https://github.com/ziglang/zig/issues/9631#issuecomment-1475133226;而实际上我也在知乎干了推荐指令这件事:https://www.zhihu.com/question/414069789/answer/2243639857)
正文其实已经完了,一些碎碎念,我逛多个社区其实有点感受到,兴趣范围导致圈子的分层,导致对同一个东西认识的层次区别。比如,搞mcucpu认识的c c++编译器可能现在是终于喜欢去查标准了,很多人脑内还是旧标准,感觉旧标准实现圆满都觉得不错了。而搞软件的认识到c c++标准太缺了,新版都还缺着很多,而且不是“高级意义上的缺”,而是向完善基本操作的,所以才有了rust zig而且已经干了很多刨根问底的事情,试图填c c++留下的坑(这里显然不是说什么a++++的事情,而是比如从“带进位加法的进位,双倍位宽乘法除法”起的,都被积极加入新系统语言早期标准基本操作);然后又有点扭曲的是,除了rust zig这种刨根型选手外的搞新“更高级”编程语言的,在标准库基操上,还是常常局限于c/c++老标准,比如Math到atan2就完工,比如至今没什么脚本能clz,尽管“js重写一切”【还好wasm也算刨根选手,中间三大金刚有了,我同样期待着加前后的那几个】……
话题往浮点那边偏一点的话,又想喷ieee754浮点数标准里又臭又长的东西了,占多少指令……
然后稍微新的动向的话……网红话题平方根倒数,确实又是适合硬件实现的,rsqrt,recip,loong都整上了,还有低精度版,这是好的。
exp log sin cos,就痛起来了(我阅读过包括计算器实现,知道怎么痛的,还有2 e 10 pi 180等等问题)。软件速度痛,硬件面积痛,最后还是推到软件了。我说说我的推荐吧,整一些新的”部分计算“指令(想想低精度rsqrt recip),用于软件实现他们而无法避开,而又夹在两层标准中间,两边都没提,但感觉更适合硬件的操作,比如:对pi/2取余(rem_pio2,最好是,像fpclassify那样保姆级定义一个象限划分,自己定一种标准【多返回值不行是吧,得像mul mulh一样两条?)
只要泰勒麦克劳林洛朗展开式,都涉及多项式求值,simd来个一发把x拓展成[x,x2,x3,x4],再跟存着的系数点积,岂不美哉?秦九韶虽然总计算量小但是全是数据依赖延迟大啊……这个思路下去,就是simd math:https://sleef.org/
然后新特殊函数,lgamma tgamma j0 j1 jn y0 y1 yn,还没想好,可能软件没什么障碍(但至少都是搭在sin cos上面的东西,都会用到那个对pi/2取余),cbrt,hypot(指数范围问题),但至少推荐指令集设计爷关注关注它们的软件实现……
更多个人想法,超低精度的ln log2 log10(甚至比如输出为一个16位定点数),对结果只是需要一个大概数量级,对带误差控制(物理实验用过的不确定度)的计算非常需要。甚至ceil(log2(hypot(2a,2b))(低精度定点数),如果一条指令能做,多舒服【
再碎一点,又回到整数,数论的最大公约数 gcd;看esp单片姬看到自带硬件蒙哥马利乘法,挺惊讶的……
在知乎想法积累的各种想法: