我是C ++的新手。最近在我的公司开始讨论为不同的机器架构编译代码,例如X86_64 AMD Vs Intel
现在我查看了我们传递给编译应用程序的gcc标志,并且没有任何内容可以告诉gcc在x86_64上专门针对AMD与Intel进行编译。
有人可以用技术术语解释编译代码和机器架构之间的依赖关系吗?
我可以在AMD上使用gcc-86_64编译代码并在intel x86_64上运行二进制代码吗?
答案 0 :(得分:2)
在x86 32位处理器之后,英特尔希望转向64位,并与惠普合作开发64位Itanium处理器。不幸的是,这不是很普遍,因为指令集和架构与x86有很大的不同。
AMD开始将已知的x86架构扩展到64位,首先称其为EM64T,然后是AMD64。就像AMD必须跟随英特尔采用32位处理器一样,英特尔现在必须跟随AMD使用64位处理器,因为AMD的64位架构比Itanium 64位处理器更受欢迎。当然,英特尔不喜欢它被称为AMD64,这就是为什么他们称之为x64,但基本上AMD64和英特尔的x64是兼容的(除了一些细微差别,见http://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64)。如果你为x64或AMD64编译,生成的代码将避免这些差异,所以在实践中你可以在两者上运行。
在任何情况下,尽量避免为Itanium(也称为IA-64)生成,因为这是一种完全不同的处理器。
答案 1 :(得分:1)
您可以使用gcc -march标志编译特定的体系结构/处理器。但是要注意,你真的不应该尝试在你的机器上运行为不同CPU /架构编译的二进制文件。它可能有效,但大多数情况下,由于二进制文件的优化方式,它会随机失败。
您可以使用较小的-mtune标志,该标志将针对特定目标CPU对其进行优化,但它仍将保留在任何CPU上运行的能力。
请参阅以下链接: What's optimal march & mtune options for gcc for "Pentium4 and above" processors http://en.gentoo-wiki.com/wiki/Safe_Cflags
答案 2 :(得分:0)
您可以对x86-64和AMD64进行不同的优化,但其中一个没有任何(AFAIK)指令 - 尽管英特尔的Itanium 64位架构不同。
答案 3 :(得分:0)
特别是像SSE4A这样的指令不能在英特尔处理器上运行。这是事情可能出错的地方之一。