百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

科普:ICC GCC傻傻分不清?聊一聊编译器那些事儿

ahcoder 2025-02-09 11:13 74 浏览

CPU这东西,大家除了关注工艺、主频、核心数量等规格信息之外,更在意的应该就是性能表现了。反应CPU性能的测试可谓是相当多样,但要说起最权威的,那就不得不提SPEC CPU测试了。

SPEC的全称是Standard Performance Evaluation Corporation,翻译过来是标准性能评估组织,它是一个全球性的第三方非营利性组织,由计算机厂商、系统集成商、大学、研究机构、咨询等多家公司组成,目标是建立、维护一套用于评估计算机系统的标准。

在CPU性能测试上,SPEC CPU 2006是SPEC组织推出的最新版的软件(上一个版本SPEC CPU 2000已经基本没有人用了),同时也是最受行业认可的测试软件。SPEC CPU 2006包括了CINT2006和CFP2006两个子项目,前者用于测量和对比整数性能,而后者则用于测量和对比浮点性能。在各种处理器的SPEC CPU 2006测试结果上,我们往往会看到ICC或是GCC的字样,那么ICC和GCC又分别代表什么呢?

什么是ICC/GCC?

ICC:全称Intel C++ Compiler,是Intel开发的C/C++/Fortran编译器套装,适用于Linux、Microsoft和Mac OS X操作系统,没有非IA指令集版本(就是说仅供x86架构CPU使用)。ICC广泛应用于高性能计算、分布式计算等商业计算领域,其向量化和并行化性能是业界的标杆,能够充分发挥现代处理器的特性。

▲ICC编译器套装提供两个版本,针对高性能计算机测试采用前者,而后者面向嵌入式及移动设备。

GCC:全称GNU Compiler Collection,GNU编译器套装,是广泛应用的Linux系统的默认编译器(特别是用于编译Linux内核)。GCC能够支持多种架构的处理器,跨平台特性相对出色。不过,GNU组织要求全部的代码由自己完成(防止版权问题),所以GCC虽然有广泛的硬件支持,但是在各硬件平台上却并不是性能最优的编译器。

▲GCC官方LOGO

到底啥是编译器?

所谓编译器,就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言→汇编语言)”的程序。它的主要工作流程:

高级语言源代码→预处理器→编译器→汇编语言,汇编语言再经过汇编器→目标文件→链接器生成可执行程序。

在这个流程中,高级语言指的就是源代码,如Pascal、C、C++、fortran、Java等,而目标文件指的是包含CPU可以执行的二进制指令的集合。也就是说,编译器起到的作用就是将程序源代码“翻译”成汇编语言,既然是“翻译”工作,往往就有Good和Better的区别,而从上面的介绍我们能够看出,不同的操作系统,能够使用的编译器是不同的,那这个编译效率自然也就存在差异。

同时,CPU也是区分不同架构的,比如x86、MIPS、ARM、Power等等,不同架构的CPU往往运行不同的操作系统,如x86架构CPU可以运行Windows、Linux(Android)和Mac OS X,而MIPS等其他架构CPU往往只能运行基于Linux开发的操作系统。

所以,不同架构的CPU,根据适合的操作系统,在SPEC CPU测试过程中编译器的选择上是不一定是唯一的,而选择哪一种编译器,站在CPU研发者的角度上,无疑会选择能让CPU性能发挥到最大的编译器。

通过前面对ICC和GCC的解读,不难看出两者的区别。ICC和GCC都可以运行在Windows和Linux下,Intel是x86架构CPU的老大,配合x86架构CPU开发了ICC,能够最大程度的发挥出x86架构CPU的真实性能。GCC能够配合更多种类架构的CPU加以使用,适用平台更广,但从CPU性能发挥的角度上看,大而广很难和专而精比拼。

但是,综合x86 CPU和Windows系统的市场占有率这两个因素来看,在CPU测试过程中,ICC和GCC的采用率又是怎样呢?

第三方商业机构更多采用ICC,GCC寥寥无几

SPEC官网(http://spec.org/)上公布着大量的专业机构测试结果供大家研究分析,笔者选定了全部的整数单笔者选定了全部的整数单任务测试结果进行分析,通过爬虫抓取了约8600个测试结果,并对测试中使用的编译器进行了数据统计:

结果是使用ICC编译器的测试结果高达95%,而GCC不足0.1%。这些测试结果基本都是独立的第三方商业机构的测试结果,具有很高的参考价值。数据显示,ICC编译器的使用在SPEC CPU 2006测试中具有压倒性的优势,而GCC则几乎没有商业机构使用。

上述统计还反映了一个事实,就是Intel和AMD的x86架构处理器在桌面及服务器领域的垄断性优势。而从其中非x86架构CPU的测试结果来看,仅剩的数个测试成绩,Power、Sparc全部使用的是针对自家指令集优化过的编译器,而非GCC,这也侧面反映了GCC“大而广”的一些问题。

产生这个现象的原因要从SPEC CPU测试成绩产生方法来说起:SPEC组织使用一台1997年的Ultra Enterprise 2主机(处理器为296MHz UltraSPARC II Processor)作为参考对象,在其上运行了全部的SPEC CPU 2006子测试,并把每一项的测试结果的用时(中间数)定位系数1。

实际测试中,假定被测试的CPU运行某项子测试的用时为A,而Ultra Enterprise 2主机同一项子测试用时为B,则用B/A,即可得到被测试CPU该项子测试的成绩,而各子测试成绩的几何平均值记为总成绩。

即SPEC各子项成绩是相对于Ultra Enterprise 2计算出来的(Ultra Enterprise 2各项成绩计为1,总分也是1)。

参考机器(Ultra Enterprise 2主机)的测试结果也公布在spec.org网站上面:

https://www.spec.org/cpu2006/results/res2006q3/cpu2006-20060513-00001.html

从中可以看出的是,作为参考成绩的测试结果也并没有使用GCC,而是Sparc自家的编译器。

ICC GCC哪个更好?

实际上,SPEC CPU测试的是应用程序的运行时间,这个是被测机器处理器、缓存、内存、编译器、操作系统等等部分性能的综合体现,并不是某个编译器或者某个CPU的单独测试结果,而且软硬件平台综合体现的结果,即按照官方规则正确跑出来的分都是可比的。SPEC CPU测试结果追求的是程序运行用时越短越好,测试成绩的优劣固然重要,但是编译器的真正的用途是“翻译语言”,在同样的硬件平台(CPU)下,“翻译”的越快就可以理解为应用启动或进行某种运算的用时更少,这就是选择编译器的重要性,也是现代应用优化的方向。

拿ICC和GCC相比,ICC是针对x86架构CPU使用的编译器,ICC在现代高性能计算领域广泛使用的向量化、并行化能力较强,而GCC作为跨平台性的编译器,在这方面性能较差,但是针对某些偏门的CPU指令集而言,GCC是唯一的选择。

ICC、GCC两者广泛应用于商业环境中、都会被应用于处理器、OS及编译器开发、测试之中。有些爱好者担心ICC过度优化,结果不准确,其实这大可不必。SPEC CPU是有严格的测试标准的,每一项测试都要求严格和参考结果一致,任何过度优化导致的程序计算错误都不会被计算在结果之中。实际上,ICC在多年的高性能计算领域已经证明了自己的可靠性,而GCC在过往版本中,也会有编译出错、计算结果不正确等现象。

▲ICC GCC区别好比如此,懂得人自然懂

最后笔者想要强调的是,硬件平台性能发挥需要合适的编译器来加以配合,合适的才是最好的,如果编译器不能合理使用,那又有何意义呢?

相关推荐

linux服务器--PVE(一)简介及安装(pve安装ifupdown2)

1.PVE(ProxmoxVirtualEnvironment)简介ProxmoxVirtualEnvironment基于debian,是一个完整的、开源的企业虚拟化服务器管理平台。它在一个平...

手把手教你!如何在 Linux 服务器中搭建 Sentinel 环境?

你在Linux服务器上搭建Sentinel环境时,是不是也遇到过各种报错,要么是启动失败,要么是配置后无法正常访问控制台?看着同事顺利搭建好,自己却一头雾水,别提多着急了!其实,很多互联网大厂...

Linux高性能服务器技术总结(linux高性能服务器编程怎么样)

1服务器简介服务器是提供计算服务的设备,由于服务器需要响应用户请求,因此在处理能力、稳定性、安全性、可扩展性、可管理性等方面提出了较高要求。随着虚拟化技术的进步,云服务器(ECS)已经快速的在...

从 0 到 1:使用 Ansible 自动化运维 Linux 服务器全流程

Ansible是一款强大的IT自动化工具,广泛用于服务器配置管理、软件部署和任务自动化。本文将带你从零开始,学习如何使用Ansible对Linux服务器进行自动化运维,涵盖Ansibl...

诡异!Win11 “此电脑” 莫名现 Linux 图标,啥情况?

我这电脑出了个怪事儿,“此电脑”下面莫名其妙多了个Linux的图标,可我压根儿就没装过Linux系统啊!琢磨了一下,估计是系统可选功能里那个“适用于Linux的Windows子系统”插件搞的鬼。实例系...

Linux基础运维篇:Linux 终端与 Shell 基础(第006课)

一、啥是终端?先搞懂「人和电脑对话的窗口」你可以把终端(Terminal)理解成一个「文字版的电脑操作台」。在Windows里,类似「命令提示符」或PowerShell;在Linux里,...

2025罗技大师系列智「简」大赛-罗技大师系列-MX KEYS S键盘评测

在2025罗技大师系列智「简」大赛中,MXKEYSS键盘凭借其卓越的设计与智能化体验,成为众多创作者的理想之选。本篇文章将深入评测这款键盘的核心功能、使用体验及创新亮点,帮助你了解它如何提升...

Linux编辑命令vim(linux使用vim编辑文件)

1、vi编辑器简介vim是一个全屏幕纯文本编辑器,是vi编辑器的增强版,我们主要讲解的是vim编辑器。可以利用别名让输入vi命令的时候,实际上执行vim编辑器,例如:#定义别名...

全选是ctrl加什么?全选的快捷键是什么介绍

如何高效使用「全选」快捷键(Ctrl+A/A)提升工作效率在日常电脑操作中,"全选"是最基础却至关重要的功能之一。无论您是文字工作者、程序员还是普通用户,掌握全选快捷键都能极大提升操作...

Linux命令大全(linux命令大全书)

个人博客:https://chunyu.work/文章较长,可以收藏备用常用快捷键(1)ctrl+c:停止进程(2)ctrl+l:清屏(3)善于用tab键(4)上下键:查找执行过的命令文件目录类(...

Xshell是做什么用的?Xshell使用教程分享

Xshell是一款功能强大的终端模拟器,支持SSH1,SSH2,SFTP,TELNET,RLOGIN和SERIAL。通过提供业界先进的性能,Xshell包含了其他SSH客户端无法发现的功能和优势,作为...

Java 开发者线上问题排查常用的 15 个 Linux 命令

作为Java开发者,线上环境的问题排查是日常工作的重要组成部分。熟练掌握Linux命令能大幅提升排查效率,快速定位进程异常、日志错误、性能瓶颈等核心问题。本文结合Java应用特点,整理1...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

别再乱学 Linux 了!这 5 个核心技巧,让你效率飙升 10 倍!

在Linux学习的漫漫长路上,不少人犹如在黑暗中摸索的行者,四处碰壁,学习效果却不尽如人意。你是不是也曾在海量的Linux知识面前迷失方向,感觉自己投入了大量时间,却收效甚微?其实,掌握Li...

Linux终端神器Terminator时隔1年回归,2.1.5新版发布

IT之家5月23日消息,科技媒体linuxiac今天(5月23日)发布博文,报道称Terminator在沉寂一年后,最新发布了2.1.5版本,在分割终端窗格时支持克隆SSH...