编译openblas报错:no such instruction: vpermpd

在CentOS 6.5环境下编译OpenBLAS时遇到内含vpermpd指令错误的问题,通过调整编译参数NO_AVX2=1成功解决了问题,避免了直接修改源代码。

在centos6.5下编译OpenBLAS时报了好多类似下面的错误:

…/kernel/x86_64/dgemm_kernel_4x8_haswell.S:1759: Error: no such instruction: `vpermpd $ 0xb1,%ymm0,%ymm0‘

在网上找到了解决办法[《centos6.7安装openblas错误》] (http://www.bubuko.com/infodetail-1994834.html),经验证确实有效。
但是这个办法要修改源码,显然有点不太可取,仔细查看了Makefile和Makefile.system两个文件,在Makefile.system中找到如下代码,一下就明白了。

ifeq ($(NO_AVX2), 1)
CCOMMON_OPT	+= -DNO_AVX2
endif

解决办法:
如下在执行make时加NO_AVX2=1参数,就避免修改源码:

make NO_LAPACKE=1 NO_SHARED=1 NO_AVX2=1

<think>好的,我现在需要帮助用户解决Tessy单元测试中出现的汇编错误,特别是关于操作数类型不匹配的问题,涉及到的指令有mov、cpsid、msr、basepri、isb和ds。首先,我得理解这些错误通常发生在什么情况下。 用户提到的错误是“operand type mismatch”,也就是操作数类型不匹配。这在汇编代码中常见于指令的操作数不符合语法要求。比如,MOV指令可能需要特定类型的寄存器或立即数,而如果用户提供的操作数不符合,就会报错。例如,使用MOV指令将一个不支持的立即数传送到某个寄存器,或者寄存器类型不正确。 接下来,我需要逐个分析涉及的指令: 1. **MOV指令**:ARM中的MOV指令有严格的操作数限制。例如,立即数必须是合法的,可能需要满足8位位图的要求。如果用户尝试将一个超出范围的立即数传给寄存器,就会出错。比如,MOV R0, #0x12345这样的指令可能会失败,因为立即数太大。 2. **CPSID指令**:这是用于禁用中断的指令,语法应为CPSID i或CPSID f,分别关闭IRQ和FIQ中断。如果用户错误地添加了操作数,比如CPSID R0,就会导致类型不匹配。 3. **MSR和MRS指令**:这些是用于访问系统寄存器的指令。例如,MSR BASEPRI, R0将R0的值写入BASEPRI寄存器。这里需要确保目标寄存器是存在的,并且源操作数是正确的寄存器。如果用户写成了MSR BASEPRI, #0x10,就会出错,因为立即数可能不被支持。 4. **ISB指令**:这是指令同步屏障,通常不需要操作数。如果用户错误地添加了操作数,比如ISB R0,就会报错。 5. **DS指令**:数据同步屏障,可能需要指定选项,如DSB SY。如果用户只写了DS而没有正确参数,或者参数错误,就会有问题。 接下来,用户的问题可能出在他们的单元测试代码中调用了这些指令,但参数不正确。例如,可能在嵌入的汇编代码中,操作数的类型或格式不符合ARM汇编器的要求。需要检查每个指令的操作数是否符合语法规范,特别是立即数的范围和寄存器的使用。 可能的解决步骤包括: - **检查指令语法**:对照ARM汇编手册,确认每条指令的操作数是否符合要求。例如,MOV是否使用了合法的立即数,CPSID是否正确使用了i或f参数。 - **检查寄存器名称**:确保使用的系统寄存器(如BASEPRI)在目标架构中存在,并且名称正确。不同ARM架构可能有不同的寄存器名称。 - **立即数处理**:如果必须使用大立即数,可能需要使用LDR指令或分解成多个MOV指令。 - **内联汇编语法**:如果这些指令是在C代码中的内联汇编,需要确保语法正确,比如正确的限定符和正确的操作数分隔符。例如,GCC的内联汇编可能需要%前缀或者不同的语法结构。 - **编译器选项**:确认编译器和汇编器的选项是否正确,特别是目标架构和指令集的设置。例如,是否启用了支持这些指令的ARM版本(如ARMv7-M)。 用户提供的引用中提到了一个C代码示例,可能涉及到函数指针和变量传递。虽然当前问题与汇编错误相关,但需要确保汇编代码与周围的C代码正确交互,比如寄存器是否被正确保存和恢复,避免上下文切换导致的问题。 此外,Tessy单元测试工具在检测资源时可能会插入一些检测代码,可能与原有的汇编指令产生冲突。需要检查测试环境配置,是否有选项需要调整以避免插入不兼容的代码。 最后,建议用户逐步注释掉相关汇编代码,定位具体哪条指令导致错误,再逐一修正。同时,查阅Tessy的文档或ARM架构手册,确认指令的正确用法。</think>针对Tessy单元测试中`check resource`报错涉及`operand type mismatch`的汇编指令错误,以下是分步解决方案: --- ### 一、错误原因分析 1. **操作数类型不匹配**:ARM汇编指令对操作数格式有严格限制,例如: - `MOV`指令可能使用了非法立即数或寄存器类型 - `MSR`/`MRS`指令访问系统寄存器时格式错误 - `CPSID`等特权指令缺少必要参数 2. **编译环境差异**:Tessy可能使用了与开发环境不同的编译器版本或优化选项 3. **内联汇编语法问题**:C代码中嵌入的汇编指令未遵循编译器语法规范 --- ### 二、具体解决方案 #### 1. 验证指令格式(以Cortex-M3为例) ```armasm ; 错误示例 mov r0, #0x12345 ; 立即数超出合法范围 cpsid ; 缺少操作数 msr basepri, #0x20 ; 立即数不允许直接写入系统寄存器 ; 正确写法 movw r0, #0x1234 ; 使用MOVW加载大立即数[^1] cpsid i ; 明确指定中断类型 mov r1, #0x20 msr basepri, r1 ; 通过通用寄存器中转 ``` #### 2. 内联汇编语法修正 ```c // 错误示例 __asm volatile("mov r0, 0x123"); // 正确写法(GCC语法) __asm volatile( "movw %0, #0x1234\n\t" "msr BASEPRI, %1" : "=r"(val1), "r"(val2) // 正确声明操作数 : : "memory" ); ``` #### 3. 编译器选项配置 在Tessy工程配置中确认: ```makefile -mcpu=cortex-m3 # 指定处理器架构 -mthumb # 使用Thumb指令集 -fno-builtin # 禁用内置函数优化 ``` #### 4. 资源检查配置 在Tessy的`Check Resource`设置中: 1. 排除系统寄存器访问检查 2. 添加特权指令白名单 3. 禁用对`DSB`/`ISB`等屏障指令的语法检查 --- ### 三、验证步骤 1. 最小化测试:单独测试包含目标指令的函数 2. 反汇编验证:通过`.map`文件确认指令编码正确性 3. 寄存器监控:使用Tessy的寄存器监视功能观察`BASEPRI`等寄存器变化 --- ### 四、典型错误对照表 | 错误指令 | 错误原因 | 修正方案 | |---------|---------|---------| | `mov r0, #0x12345` | 立即数超出8位位图范围 | 使用`movw`+`movt`组合 | | `msr basepri, #0x20` | 系统寄存器不能直接赋立即数 | 通过通用寄存器中转 | | `cpsid` | 缺少中断类型参数 | 改为`cpsid i`或`cpsid f` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值