华为计算微信公众号
华为计算微博
华为计算今日头条
【常见编译脚本、编译选项移植】
功能说明
X86代码
鲲鹏代码
为指定类型处理器要生成相应指令
-march=i386
-march=armv8-a
crc32使能编译选项,支持生成 crc32 指令
-mcrc32
-march=armv8-a+crc32
定义编译生成的应用程序为32位,
编译选项不同
-m32
-mabi=ilp32
(gcc低版本不支持,推荐gcc7.3以上)
指定目标处理器名称,
以使生成的代码性能更优
-mtune=intel
Gcc9.1及以上版本可指定
-mtune=tsv110
使用SSE指令生成浮点运算
-mfpmath=sse
无该编译选项、删除
X86下SSE相关编译选项
-msse/-sse2/-sse4/…
删除该部分编译选项
指定生成代码的大小端序
默认是小端序
指定大端序 -mbig-endian
指定小端序 -mlittle-endian
Char数据类型修改
默认char为有符号,无需指定
-fsigned-char(默认char无符号)
【常见builtin函数】
无需移植的常用builtin函数列表:
X86/鲲鹏 代码
计算变量x(uint32)的二进制中1的个数
__builtin_popcount(uint32 x)
按字节翻转x(uint32),返回翻转后的结果
__builtin_bswap32 (uint32_t x)
按字节翻转x(uint16),返回翻转后的结果
__builtin_bswap16 (uint16_t x)
变量x中1的个数的奇偶性
__builtin_parity(x)
判断type1和type2是否是相同的数据类型
__builtin_types_compatible_p(type1, type2)
引导gcc进行条件分支预测
__builtin_expect (long exp, long c)
返回x中最后一个为1的位是从后向前的第几位
__builtin_ffs(x)
判断exp是否在编译时就可以确定其为常量
__builtin_constant_p (exp)
变量x二进制下末尾0的个数
__builtin_ctz(x)
变量X二进制下前导0的个数
__builtin_clz(x)
内存数据预取到cache中
__builtin_prefetch(x)
【常见内联汇编函数】
指令给处理器提供提示,以提高spin-wait循环的性能
__asm__ (“pause" : : : memory")
__asm__ ("yield" : : : memory")
rep为x86的重复执行指令,需替换为ARM64的rept指令
#define nop __asm__ __volatile__("rep;nop": : :"memory")
#define __nops(n) ".rept " #n "\nnop\n.endr\n"
#define nops(n) asm volatile(__nops(n))
获取精准时间戳
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
鲲鹏小智搜索rdtsc,提供3种替换方案
计算8bit数的crc32校验值
__asm__("crc32b %1, %0" : "+r"(crc) : "rm"(v))
__asm__ crc32cb %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v))
计算16bit数的crc32校验值
__asm__("crc32w %1, %0" : "+r"(crc) : "rm"(v))
__asm__ crc32ch %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v))
计算32bit数的crc32校验值
__asm__("crc32l %1, %0" : "+r"(crc) : "rm"(v))
__asm__ ("crc32cw %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v)
计算64bit数的crc32校验值
__asm__("crc32q %1, %0" : "+r"(result) : "rm"(v))
__asm__ ("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(v))
对整数变量进行原子加
asm (LOCK_PREFIX "addl %1,%0" : "+m" (v->counter) : "ir" (i))
__sync_add_and_fetch(&((*v).counter), 1)
使用gcc的builtin,把内存数据预取到cache中
asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x))
__builtin_prefetch(_x)
本帖最后由 匿名用户 于 2025/04/01 17:18:36 编辑
我要发帖子
【常见编译脚本、编译选项移植】
功能说明
X86代码
鲲鹏代码
为指定类型处理器要生成相应指令
-march=i386
-march=armv8-a
crc32使能编译选项,支持生成 crc32 指令
-mcrc32
-march=armv8-a+crc32
定义编译生成的应用程序为32位,
编译选项不同
-m32
-mabi=ilp32
(gcc低版本不支持,推荐gcc7.3以上)
指定目标处理器名称,
以使生成的代码性能更优
-mtune=intel
Gcc9.1及以上版本可指定
-mtune=tsv110
使用SSE指令生成浮点运算
-mfpmath=sse
无该编译选项、删除
X86下SSE相关编译选项
-msse/-sse2/-sse4/…
删除该部分编译选项
指定生成代码的大小端序
默认是小端序
指定大端序 -mbig-endian
指定小端序 -mlittle-endian
Char数据类型修改
默认char为有符号,无需指定
-fsigned-char(默认char无符号)
【常见builtin函数】
无需移植的常用builtin函数列表:
功能说明
X86/鲲鹏 代码
计算变量x(uint32)的二进制中1的个数
__builtin_popcount(uint32 x)
按字节翻转x(uint32),返回翻转后的结果
__builtin_bswap32 (uint32_t x)
按字节翻转x(uint16),返回翻转后的结果
__builtin_bswap16 (uint16_t x)
变量x中1的个数的奇偶性
__builtin_parity(x)
判断type1和type2是否是相同的数据类型
__builtin_types_compatible_p(type1, type2)
引导gcc进行条件分支预测
__builtin_expect (long exp, long c)
返回x中最后一个为1的位是从后向前的第几位
__builtin_ffs(x)
判断exp是否在编译时就可以确定其为常量
__builtin_constant_p (exp)
变量x二进制下末尾0的个数
__builtin_ctz(x)
变量X二进制下前导0的个数
__builtin_clz(x)
内存数据预取到cache中
__builtin_prefetch(x)
【常见内联汇编函数】
功能说明
X86代码
鲲鹏代码
指令给处理器提供提示,以提高spin-wait循环的性能
__asm__ (“pause" : : : memory")
__asm__ ("yield" : : : memory")
rep为x86的重复执行指令,需替换为ARM64的rept指令
#define nop __asm__ __volatile__("rep;nop": : :"memory")
#define __nops(n) ".rept " #n "\nnop\n.endr\n"
#define nops(n) asm volatile(__nops(n))
获取精准时间戳
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
鲲鹏小智搜索rdtsc,提供3种替换方案
计算8bit数的crc32校验值
__asm__("crc32b %1, %0" : "+r"(crc) : "rm"(v))
__asm__ crc32cb %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v))
计算16bit数的crc32校验值
__asm__("crc32w %1, %0" : "+r"(crc) : "rm"(v))
__asm__ crc32ch %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v))
计算32bit数的crc32校验值
__asm__("crc32l %1, %0" : "+r"(crc) : "rm"(v))
__asm__ ("crc32cw %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v)
计算64bit数的crc32校验值
__asm__("crc32q %1, %0" : "+r"(result) : "rm"(v))
__asm__ ("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(v))
对整数变量进行原子加
asm (LOCK_PREFIX "addl %1,%0" : "+m" (v->counter) : "ir" (i))
__sync_add_and_fetch(&((*v).counter), 1)
使用gcc的builtin,把内存数据预取到cache中
asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x))
__builtin_prefetch(_x)