鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

Rust SSE类指令迁移

SSE类指令是x86下的一种SIMD(Single Instruction Multiple Data)指令,鲲鹏下对应为NEON指令,其通过单条指令同时操作多个数据,提升运行速度。SSE/NEON intrinsic函数是一系列由编译器封装以便于高级语言调用的函数,编译后可生成SSE/NEON指令序列,其提供与编写SSE/NEON汇编指令相同的功能,但是将寄存器分配等工作留给编译器,以便开发者更易于使用。

SSE intrinsic函数的迁移与C/C++下的迁移类似,可以参考AvxToNeon工程进行移植,主要差异在于调用方式上,使用时需增加target_feature属性为neon,且指定use std::arch::aarch64::*。与内嵌汇编类似,SSE intrinsic函数代码段也需写在unsafe的作用域下,编译时增加+nightly编译选项。

现象描述:

源码包含x86 SSE intrinsic函数时,编译报错如:unresolved import 'std::arch::x86_64'或cannot find function '_mm_set1_epi8' in this scope。

示例:

以下示例展示rust语言中SSE intrinsic函数如何迁移到鲲鹏处理器,代码段功能是使用单条指令完成两个向量寄存器中的数据逐通道相加。

// x86平台下实现
#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "sse"))] 
fn add() 
{
    #[cfg(target_arch = "x86_64")]     
    use std::arch::x86_64::*;
    unsafe {
        let veca = _mm_set1_epi8(4,4,4,4);
        let vecb = _mm_set1_epi8(3,3,3,3);
        let result = _mm_add_epi8(veca, vecb);
    }
}
// 对应鲲鹏下实现
#![feature(stdsimd)]
#[cfg(all(any(target_arch = "aarch64"), target_feature = "neon"))]
fn add()
{
    use std::arch::aarch64::*;
    unsafe {
        let veca = vdupq_n_s8(4);
        let vecb = vdupq_n_s8(3);
        let result = vaddq_s8(veca, vecb);
    }
}