在学习 LoongArch 汇编时遇到的问题,请问有人能给我解答吗?
LEI-Xiongwei
我又有新的问题了,一段时间没上Compiler Explorer,发现不知道怎么回事,输出的汇编多了些不知道什么意思的新标签。请问各位大佬,这些LFB,LBB和LVL等标签是什么意思啊?
xry111
LFB: Label for Function Beginning
LBB: Label for Block Begin
LVL: Last Variable Location
LBE: Label for Block End
都是调试信息会引用的位置。Compiler Explorer 默认会把这些滤掉,你应该是不小心点到了什么设置,打开 Filter 菜单把 Unused Labels 勾上就滤掉了。
LEI-Xiongwei
各位大佬,我在QEMU上的arch linux测试,把相应地方的复制代码改成了向量指令,运行时间反而变长了。这是怎么回事?
源码:
默认生成的汇编:
我把对应地方代码改成向量指令之后的汇编:
默认-O1优化执行结果:
我修改代码后的执行结果:
多执行几次,输出的时间还不一样,最高我还看见有300多的。
qemu是最新的8.1版本,官方文档说这个版本开始支持Loongarch的LSX向量指令集。向量指令的我是从龙芯提交给上游binutils的源码里反汇编需要的那个opcodes文件夹里找到的,里面有现在龙架构所有的指令名称。
所以这到底是为什么呢?我真的需要买真实的物理硬件吗?
xry111
LEI-Xiongwei 除了虚拟化会引入无法预计的性能变化外,这个 benchmark 输出结果所用的时间显著大于计算的时间,所以没有意义。
我弄了一个
#include <stdio.h>
#define N 100000000
int main()
{
static int a[N], b[N], c[N];
asm("":"=m"(a), "+m"(b));
for (int i = 0; i < N; i++)
c[i] = a[i] + b[i];
asm(""::"m"(c));
}
硬件上开 -mlsx 0.20 秒,不开 0.23 秒。
xry111
LEI-Xiongwei 你也可以要一个 SSH access,比如 https://portal.cfarm.net/ 。
LEI-Xiongwei
另外如果我把数组大小改成65535,向量化更改后编译出来的文件就不能执行了,会提示“核心已转储”。不得已我才改成10000的。
xry111
LEI-Xiongwei 因为栈溢出了。默认存储的局部变量要在栈上分配空间,而 Linux 默认的栈限制通常是 8 MB。
LEI-Xiongwei
我对GCC还没有贡献,怎么申请啊?
LEI-Xiongwei
xry111 请问一下,您的编译器是龙芯版的而不是官方的吗?我现在用的编译器没有-mlsx这个参数。
xry111
LEI-Xiongwei 是 GCC 14 的 snapshot,GCC 14 要到明年第二季度正式发布。
LEI-Xiongwei
xry111 请问大佬,做C语言底层库的适配优化工作是需要写纯汇编,还是只要C源码上的内嵌汇编?
LEI-Xiongwei
xen0n
LEI-Xiongwei 做C语言底层库的适配优化工作是需要写纯汇编,还是只要C源码上的内嵌汇编?
显然是根据需要而灵活选择。一般是不喜欢很多汇编的,因为不好维护,一般将其控制在必须的最低限度即可。
xen0n
LEI-Xiongwei 不需特别折腾。这文章的作者现在是龙芯员工了,文章里提到的东西都已经进入上游glibc,对着函数名找具体实现方式就行了。
LEI-Xiongwei
xen0n 最新版本的glibc 2.38 里面的字符串处理函数变得挺抽象的,我还没找到对应的汇编在哪儿。 😅
LEI-Xiongwei
xen0n 我在glibc 2.38 的 sysdep/loongarch 目录下没有找到跟字符串优化相关的汇编代码。
Sunny
LEI-Xiongwei
在 "https://sourceware.org/git/glibc.git" 所在的仓库中查看git log,"dengjianbo" 大佬应该是相关补丁提交者
LEI-Xiongwei
Sunny 网址打不开。
LEI-Xiongwei
Sunny 非常感谢! 😃
LEI-Xiongwei
打开了,应该是梯子的问题。