当前位置: 首页 > news >正文

AMD或Intel上编译出来的程序,可以跑在海光上吗?

        在上一篇博文《海光处理器与AMD Zen1的指令差异-CSDN博客》中发现,海光相比AMD,缺失了一些指令集。

        那么在AMD或Intel上编译出来的程序,可以跑在海光上吗?

        这个问题的关键,在于编译器默认使用哪些指令来编译程序。以CentOS8.4为例,它自带的gcc版本为gcc version 8.4.1 20200928:

[root@CentOS8 ~]# gcc -v

Using built-in specs.

COLLECT_GCC=/usr/bin/gcc

COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper

OFFLOAD_TARGET_NAMES=nvptx-none

OFFLOAD_TARGET_DEFAULT=1

Target: x86_64-redhat-linux

Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux

Thread model: posix

gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)

        gcc在编译的时候,可通过-march=来指定要使用的指令范围,默认值为-march=x86-64,这个默认值是构建gcc自身时指定的,即上表中的--with-arch_32=x86-64。

        接下来看一下-march=x86-64代表的指令范围。

[root@CentOS8 ~]# gcc -march=x86-64 -c -Q --help=target | grep -i enabled

  -m128bit-long-double                  [enabled]

  -m64                                  [enabled]

  -m80387                               [enabled]

  -malign-stringops                     [enabled]

  -mavx256-split-unaligned-load         [enabled]

  -mavx256-split-unaligned-store        [enabled]

  -mfancy-math-387                      [enabled]

  -mfp-ret-in-387                       [enabled]

  -mfxsr                                [enabled]

  -mglibc                               [enabled]

  -mhard-float                          [enabled]

  -mieee-fp                             [enabled]

  -mlong-double-80                      [enabled]

  -mmmx                                 [enabled]

  -mno-sse4                             [enabled]

  -mpush-args                           [enabled]

  -mred-zone                            [enabled]

  -msse                                 [enabled]

  -msse2                                [enabled]

  -mstv                                 [enabled]

  -mtls-direct-seg-refs                 [enabled]

  -mvzeroupper                          [enabled]

        这些指令代表什么意思呢?

 -march=x86-64 of GCC8.4.1(CentOS8.4)x86-64Instructions
m128bit-long-double[enabled]sizeof(long double) is 16.
m64[enabled]Generate 64bit x86-64 code.
m80387[enabled]Use hardware fp.
malign-stringops[enabled]Align destination of the string operations.
march=x86-64Generate code for given CPU.
mavx256-split-unaligned-load[enabled]d Split 32-byte AVX unaligned load.
mavx256-split-unaligned-store[enabled]re Split 32-byte AVX unaligned store.
mfancy-math-387[enabled]Generate sin, cos, sqrt for FPU.
mfp-ret-in-387[enabled]Return values of functions in FPU registers.
mfxsr[enabled]Support FXSAVE and FXRSTOR instructions.
mglibc[enabled]Use GNU C library.
mhard-float[enabled]Use hardware fp.
mieee-fp[enabled]Use IEEE math for fp comparisons.
mlong-double-80[enabled]Use 80-bit long double.
mmmx[enabled]Support MMX built-in functions.
mno-sse4[enabled]Do not support SSE4.1 and SSE4.2 built-in functions and code generation.
mpush-args[enabled]Use push instructions to save outgoing arguments.
mred-zone[enabled]Use red-zone in the x86-64 code.
msse[enabled]Support MMX and SSE built-in functions and code generation.
msse2[enabled]Support MMX, SSE and SSE2 built-in functions and code generation.
mstv[enabled]Disable Scalar to Vector optimization pass transforming 64-bit integer computations into a vector ones.
mtls-direct-seg-refs[enabled]Use direct references against %gs when accessing tls data.
mvzeroupper[enabled]Generate vzeroupper instruction before a transfer of control flow out of the function.

        很明显,这个-march=x86-64代表的指令范围很小,海光全部都支持。所以,默认情况下,在AMD上编译的程序,依然可以跑在海光上。 

         如果gcc编译的时候指定-march=znver1,那么海光可以运行吗?答案是否定的,因为至少有2个指令集海光是不支持的:aes和pclmul。

        只有一种特例:那就是程序本身并不涉及加解密,编译之后的汇编代码不包括aes和pclmul相关指令,即使编译的时候指定-march=znver1,那么这个程序还是可以跑在海光上的。

 -march=??? of GCC8.4.1(CentOS8.4)x86-64znver1
m128bit-long-double[enabled][enabled]
m64[enabled][enabled]
m80387[enabled][enabled]
mabm[disabled][enabled]
madx[disabled][enabled]
maes[disabled][enabled]
malign-stringops[enabled][enabled]
march=x86-64znver1
mavx[disabled][enabled]
mavx2[disabled][enabled]
mavx256-split-unaligned-store[enabled][enabled]
mbmi[disabled][enabled]
mbmi2[disabled][enabled]
mclflushopt[disabled][enabled]
mclzero[disabled][enabled]
mcx16[disabled][enabled]
mf16c[disabled][enabled]
mfancy-math-387[enabled][enabled]
mfma[disabled][enabled]
mfp-ret-in-387[enabled][enabled]
mfsgsbase[disabled][enabled]
mfxsr[enabled][enabled]
mglibc[enabled][enabled]
mhard-float[enabled][enabled]
mieee-fp[enabled][enabled]
mlong-double-80[enabled][enabled]
mlzcnt[disabled][enabled]
mmmx[enabled][enabled]
mmovbe[disabled][enabled]
mmwaitx[disabled][enabled]
mpclmul[disabled][enabled]
mpopcnt[disabled][enabled]
mprfchw[disabled][enabled]
mpush-args[enabled][enabled]
mrdrnd[disabled][enabled]
mrdseed[disabled][enabled]
mred-zone[enabled][enabled]
msahf[disabled][enabled]
msha[disabled][enabled]
msse[enabled][enabled]
msse2[enabled][enabled]
msse3[disabled][enabled]
msse4[disabled][enabled]
msse4.1[disabled][enabled]
msse4.2[disabled][enabled]
msse4a[disabled][enabled]
mssse3[disabled][enabled]
mstv[enabled][enabled]
mtls-direct-seg-refs[enabled][enabled]
mtune=genericznver1
mvzeroupper[enabled][enabled]
mxsave[disabled][enabled]
mxsavec[disabled][enabled]
mxsaveopt[disabled][enabled]
mxsaves[disabled][enabled]

如果你觉得有用,请点赞收藏哈! 

http://www.lryc.cn/news/442457.html

相关文章:

  • ChatGPT 4o 使用指南 (9月更新)
  • 微信getUserProfile不弹出授权框
  • iostat 命令:系统状态监控
  • 从底层原理上解释 ClickHouse 的索引
  • 9.20-使用k8s部署wordpress项目
  • OSPFv3协议几类LSA介绍
  • 煤矿智慧矿井数据集 (1.煤矿采掘工作面智能分析数据集2.煤矿井下钻场智能分析数据集 )
  • 举例说明协方差的数学公式计算步骤以及皮尔逊相关系数数学公式的计算步骤
  • 2024/9/16论文赏析(均为1区或顶刊
  • IDEA 2024.3 EAP新特征早览!
  • 如何在安卓設備上更換IP地址?
  • LINUX网络编程:TCP(1)
  • 基于PHP的新闻管理系统
  • 6.C++程序中的基本数据类型
  • oracle 11g写一个判断是否是身份证的函数,函数名称为:FUN_IS_IDENNO
  • 如何使用Spring Cloud Gateway搭建网关系统
  • 油烟机制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 《拿下奇怪的前端报错》序章:报错输出个数值数组Buffer(475) [Uint8Array],我来教它说人话!
  • Docker 里面按照ifconfig
  • DOS(Disk Operating System,磁盘操作系统)常用指令
  • VSCode集成Python环境搭建配置详细步骤
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
  • Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册
  • 发现编程的全新境界——明基RD280U显示器使用体验
  • 使用阿里OCR身份证识别
  • 8. 详细描述一条 SQL 语句在 MySQL 中的执行过程。
  • C++--类的实例化
  • Vue vs React vs Angular 的对比和选择
  • Yolov8-pose关键点检测:一种新的自适应算法轻量级通道分割和变换(ALSS)模块,解决红外检测场景存在严重遮挡和重叠目标时的局限性
  • 无人机飞手培训机构六旋翼训练无人机技术详解