mask intrinsic

今日我发现riscv gnu toolchain使用gcc 15.0 release构建出来riscv64-unknown-elf-gcc和riscv64-unknown-linux-gnu-gcc编译出来的测试vmsbf intrinsic程序跑的结果不一致,我大受震撼第二次。 发现的起因是K1开发板gcc版本为15.1.0与我使用gcc15交叉编译测试结果不一致,但与ta=1s没关系,我大受震撼第一次。 由于我之前对riscv-gnu-toolchain进行了大量不可描述操作,于是进行删库跑路,没想到clone仓库和submodule就花了整整一天,网上冲浪越来越难了。由于glibc的字母排在newlib前面,于是submodule先clone下来进行了一次make linux,发现和riscv64-unknown-elf-gcc、K1的native gcc结果都不一样。 Update: 我认为的不同gcc release构建出来的结果不一样的原因: tail policy在qemu 7.0、qemu 10.0和K1上表现不一致 qemu和K1 在gcc 开启 -O3 优化时表现不一致,根据我手动计算的结果,应该是qemu的问题。

June 19, 2025 · xyenchi

mask intrinsic

vmsbf.m 是把第一个1之前所有的元素置0 __riscv_vmsbf_m_b1_m(vm, vs2,vl) vm在前,vs2在后。 vfirst是找到mask寄存器中的第一个1,返回index到通用寄存器。 但是RISC-V是大端序,用intrinsic不是,(划掉。

June 18, 2025 · xyenchi

工作日更

今日我进行了大量思考,究竟想要干什么样的工作。在 leader 开会时跟我说别干 RIF 了,但老板其实在 群里说了转成内部项目继续做,我也认同了继续做。一时间疑惑、愤怒涌上了心头,思考了很久这到底是哪里 出了问题。到底是我对这项目的评估不正确还是leader不正确。后来问了邱老师如何评估这项目,她跟我讲 了很多,所以我还是会做下去吧。 在soha的帮助下将 rvv-intrinsic-doc 生成 segment load and store 的 return type 改成了 vs3的 type,用的是简单粗暴的识别“void”,调用 RIFtype 中的 to_type_class 进行简单的字符串 匹配并转换。怎么越来越屎山了(逃,延迟的馊主意真多啊。过程中因为函数在类中无法调用,于是加了一个 静态函数。 尚且没想好 SizePtr 该怎么做,今日观察 spec 觉得只是简单表示多少byte的值,可能并不需要新构造 一个 SizePtr。 RIF部分发现了使用##拼接的变量在结构体中以拼好的形式遍历的,所以直接在==两边写不带Scalar的自定 义变量名称是无法识别的。 最后老板把我双周会的活交给了新同事,终于不用每双周惦记着了。

March 26, 2025 · xyenchi

工作日更

今日我研究 vslideup vslidedown,虽然貌似看懂了是在做什么,但改 RIF 中使用的 spike 头文件 依旧十分棘手。 首先尽量不能动 spike 头文件本体,毕竟日后 spike 如果更新了什么,这将变成不可描述的未来。 其次slideup slideup并不像其他运算进行了高度抽象,头文件本体中并不含有 sew 的判断。 最后,还是以前的问题,我根本无法想象展开之后是什么样。 所以我决定暂时移除相关指令,先解决别的问题。 进行一次构建通过后产生了大量数组数据没有逗号的问题和无法识别operator type报错,在找到一处疑似 需要添加的地方进行添加之后测例中没有内容生成,并还是无法识别operator type报错。于是我添加了 C++ 部分对 segment load and store 和 Miscellaneous op 的code gen,实现逻辑应该是不太 对,待研究。

March 26, 2025 · xyenchi

工作日更

今日我在soha的大力帮助下解决了 RIF 的 C++ 部分不同结构体之间 input_nfield 和 output_nfield 的继承问题和类型问题。 观测到load store的enum想加入segment load store很麻烦,咨询C++专家之后,jpgg和able给出了 RIF 中无法使用的 C++ 20 特性,进行学习。RIF 使用 C++ 17。 其中包括: concepts NTTP 最后 RIF 出现大量指令的 python 头文件含有 dataMO 的旧版本已知问题和没有spike insn文件夹 中的正确的运算头文件已知问题。待研究。

March 25, 2025 · xyenchi

工作日更

今天我思考了 vssseg 的 void type 问题,发现可以不用void type存返回值,使用vs3的类型来存。 因为反正也需要存成数组才能与golden进行比较。 跟邱老师说了现在方案行不通的想法,主要观点是想要对 segment load store 的数据进行常规操作, 需要和vset,vget等intrinisc绑定以获取一维数组。他们觉得可以以直接load store的形式实现,我 觉得也行。 发现 include/CustomOperator.def 中input field虽然存了所有参数的nf,但其实有用的只有一个 于是修改了生成脚本。 但还是不会改 include/Basic.hpp 最后针对这次失败的做项目经历狡辩了一个多小时。

March 24, 2025 · xyenchi

真的日更

PyCharm选中多行快捷键: alt+shift+insert 切换到 colume 模式 PyCharm全选并删除光标之前的内容 : ctrl+shift+home / command+shift+⬆️ mac VScode打开md文件预览快捷键:command+k v 上次参加龙哥的gcc培训,听起来三星的人水平不低,而且想学习优化相关知识,但我没有。 按照老板的规划,八月份可能就轮到我了。 在龙哥讲课的时候翻看了gcc源代码,发现gcc riscv intrinisc tail policy没有我的测试用例 写得激进。或许测不过的部分原因找到了= =0 继续研究 riscv-intrinsic-fuzzeing-test 的写法。 TypeInfo貌似是intrinsic操作数的类型信息,但我不敢确定。 在jpgg和soha的帮助下了解了下列代码的奇妙用法: enum TypeClass { SIGNED_INT, UNSIGNED_INT, FLOAT, BOOL, NumberOfTypeClasses, }; NumberOfTypeClasses可以用来表示TypeClass这个enum的总数。 现在卡在代表vlseg的 new vl 类型 size_t * 的 SizePtr无法识别。

March 21, 2025 · xyenchi

真的日更

今日终于结束了 RVI hackathon hub 相关的时间和场地事宜。 看了眼 codasip 和 andes 出的题目,范围好窄,而且和联动单位风格不太搭,在筹备别的题目了。 给gcc提交xuantie的-mcpu patch玄铁的人回话了,果然说和他们的spec、命名方式啥的不一样。 但其实他们的tune info也没有写指令cost。 发现了一份gcc代码编辑器的配置,还蛮有用的。 说完我把mac的IDE配了一下,里面gcc的.md文件格式把blog的.md文件格式创了。 最近在思考是不是在无法赚钱无法提升能力的事情上花了太多时间精力。

March 20, 2025 · xyenchi

整理碎片

SIGABRT 程序的异常终止,如调用abort SIGFPE 错误的算数运算,如除0或导致溢出 SIGILL 检测非法指令 SIGEGV 非法访问内存 SIGTERM 发送到程序的终止请求 新旧版intrinsic tail policy 对照表: TAMA TUMA TUMU TAMU Vm=0 _m _tum _tumu _mu Vm=1 _tu _tu rvv-intrinsic-doc的对照: InstInfo.get(SEW, LMUL, [“OP”], inst_type, mem_type, extra_attr, required_ext=required_ext) vfmv 和 vmv 类型(不一定对): 指令 操作数类型 vfmv f_s v_f s_f vmv s_x x_s v_x v_i

March 16, 2025 · xyenchi

进行近期总结

好久没写nonsense了。 进行近期的记忆备份。 device tree source 与 device tree binary 相互转换 安装device-tree-compiler工具 dts转dtb dtc -I dts -O dtb *.dtb *.dts dtb转dts dtc -I dtb -O dts *.dts *.dtb 研究 RISC-V vlse 指令学习了 C++ ptrdiff_t类型。 一句话介绍: std::ptrdiff_t is used for pointer arithmetic and array indexing, if negative values are possible. possible implementation: // valid since C++11 using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr)); example: #include <cstddef> #include <iostream> int main() { const std::size_t N = 10; int* a = new int[N]; int* end = a + N; for (std::ptrdiff_t i = N; i > 0; --i) std::cout << (*(end - i) = i) << ' '; std::cout << '\n'; delete[] a; } Output: 10 9 8 7 6 5 4 3 2 1 顺便学习了 size_t竟然是有符号的。 ...

March 12, 2025 · xyenchi