- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个虚拟机;它们都运行在相同的Intel Xeon E5-2699v4(Broadwell EP)平台上。但是,一个虚拟机(生产机)驻留在一个禁用了这些功能的主机上,而另一个虚拟机(构建机)则全部启用这些功能。我们也有其他主机运行在Intel Xeon E5-2699v3平台(Haswell EP)上,但这些主机将在稍后处理。通过观察来自本地计算机的单行bash命令的结果,我可以确定禁用了哪些功能:
sort <(sshi vm1 "cat /proc/cpuinfo | grep flags | head -n 1 | sed -r 's/\s+/\t/g' | cut -f 3- | sed -r 's/\t/\n/g' | sort | uniq") <(sshi vm2 "cat /proc/cpuinfo | grep flags | head -n 1 | sed -r 's/\s+/\t/g' | cut -f 3- | sed -r 's/\t/\n/g' | sort | uniq") | uniq -u
sshi
是bash别名,用于确定连接时要使用的密钥文件,
vm1
是启用了所有功能的计算机的主机名,
vm2
是未启用所有功能的计算机的主机名。我认为这个单行命令可以与一个循环配对,以生成编译器的功能启用标志。。。
for feature in $(...); do echo "-mno-${feature}"; done
-mno-abm
-mno-avx
-mno-avx2
-mno-bmi1
-mno-bmi2
-mno-eagerfpu
-mno-fma
-mno-hle
-mno-invpcid
-mno-movbe
-mno-pcid
-mno-pse36
-mno-rtm
-mno-tsc_adjust
-mno-xsave
-mno-xsaveopt
LIST(APPEND COMMON_FLAGS /* paste flags here, along with other things such as -Wall -pedantic -Werror=etc */)
SET_PROPERTY(TARGET my_target PROPERTY COMPILE_OPTIONS ${COMMON_FLAGS})
g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
on
devtoolset-4
提供的
Oracle Linux Server 7.3
时出现编译错误:
c++: error: unrecognized command line option ‘-mno-bmi1’
c++: error: unrecognized command line option ‘-mno-eagerfpu’
c++: error: unrecognized command line option ‘-mno-invpcid’
c++: error: unrecognized command line option ‘-mno-pcid’
c++: error: unrecognized command line option ‘-mno-pse36’
c++: error: unrecognized command line option ‘-mno-tsc_adjust’
-mno-bmi
而不是
-mno-bmi1
来解决
gcc -march=native -Q --help=target
找到了这个有趣的小道消息。使用这个搜索特性并不能显示所有丢失的特性标志,所以这对我来说似乎是一个死胡同。
-mno-bmi1
改成
-mno-bmi
对我来说意味着
/proc/cpuinfo
(或其他地方)报告
最佳答案
为什么功能集不能直接转换为编译器的功能标志?如果这是一个编译器根本不理解或不支持的“新”特性,我当然会理解。。。但是,将-mno-bmi1改为-mno-bmi对我来说意味着在命名功能集方面存在分歧。
我从来没看过关于这个的讨论,所以我不能发表评论。也许您可以在gcc帮助列表或内核邮件列表中询问。
我知道,由于Clang和Solaris的原因,我花了相当多的时间在将/proc/cpuinfo
标志映射到编译器标志上(还有FreeBSD,您必须检查/var/run/dmesg.boot
)。另请参见Crypto++ ARM logic、Crypto++ x86 logic和Crypto++ Solaris logic。
是否有更好的方法从启用了所有功能的计算机编译完全优化的生成,以针对禁用了某些功能的计算机?
对于x86上的GCC(如i686和x86_64)和GCC>=5.0,可以使用多个函数。参见GCC手册中的7.8 Function Multiversioning。
所有的赌注都是对海湾合作委员会的手臂,所有的赌注都是对叮当。而且它在带有SunCC编译器的Solaris上也不工作。
在实践中发生的事情是为特性设置“步骤”,然后使用运行时CPU特性检测来选择实现(这就是GCC多功能所做的)。对于x86,步骤通常如下:
直C/C++
SSE2号
SSE3+SSSE3
SSE4.1+SSE4.2标准
AVX或AVX2
AVX/AVX2将分别包括BMI和BMI2。Microsoft编译器只使用SSE2和AVX以及AVX2。
仍然有通配符,如AES、CLMUL、RDRAND、RDSEED、SHA等,但大多数库不需要担心它们。关注点通常仅限于加密库。
我还注意到GCC在__MOVBE__
时没有定义-march=native
,并且机器是有能力的。另请参见gcc帮助邮件列表中的__MOVBE__ not defined when movbe feature is available?。
对于ARM,通常是:
直C/C++
霓虹
与x86一样,加密库所使用的通配符包括PMULL、PMULL2、AES、SHA1、SHA2。
是否有一个映射描述了内核通过/proc/cpuinfo(或其他地方)报告的功能名称以及编译器使用的名称?
我不知道。您可以在Unix和Linux堆栈交换上的What do the flags in /proc/cpuinfo mean?中查找CPU特性,然后从GCC的x86 Options、ARM Options中找出arch选项。
就像我说的,我花了相当多的时间来测试Crypto++,所以你可以从以下文件中截取它:
Crypto++ ARM logic
Crypto++ x86 logic
Crypto++ Solaris logic
如果您想看一个使用GCC多功能的例子,那么请查看Jack Lloyd's Botan。
快速评论:
由Oracle Linux服务器7.3上的devtoolset-4包提供:
c++: error: unrecognized command line option ‘-mno-bmi1’
c++: error: unrecognized command line option ‘-mno-eagerfpu’
c++
不是GCC(或者更准确地说,
g++
),或者它是一个旧的GCC 4.x编译器。
CXXFLAGS="-march=x86_64 -msse2 -msse3 -msss3 -msse4_1 -msse4_2 -mavx -mbmi"
-march=native
中减去什么。你不必担心Clang对
-march=native
有什么不同的行为。
-march=native
行为的叮当错误报告:
关于c++ - 如何确定要为体系结构启用或禁用的功能标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42010971/
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我遇到了这两个文档(它们是用意大利语写的,尽管代码注释是英文的): http://home.deib.polimi.it/brandole/acsocr/L13%20-%20Generic%20Ass
我的主要目标是提供一个用 jquery 编写的基于 solr 的搜索应用程序。 (不熟悉solr的,就假设它是一个可以返回搜索结果的rest api。)为了这个目标,我编写了许多小型应用程序和 ser
这个问题是关于选择“正确”类型的NoSQL数据库的,我希望甚至可以根据我将在下面列出的一些需求/用例以及当前正在使用的传统RDBMS解决方案,讨论特定的数据库以及它们为什么适用。地点。时间长了一点,但
在 Java 中我运行: System.out.println(Math.log(249.0/251.0)); Output: -0.008000042667076265 在 C# 中我运行:<- 已
我目前正在考虑通过 Redux 将 Context 实现到我们的一个应用程序中,但是,我似乎找不到任何关于什么是大型应用程序的最佳结构的信息? Redux 有一个定义的方法来创建 reducer、ac
我正在使用 mailcore 框架,但收到错误消息“archtecture x86 的重复符号”以及“找不到选项的目录” 下面是错误日志。 Ld /Users/user/Library/Develop
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 11 个月前关闭。 Improve t
假设我正在从 C++ 移植代码并需要在 C# 中模拟相同的位移技术: 每当我执行位移时,我是否必须考虑架构的 Endain-ness? 最佳答案 没有。位移是一种纯粹的代数运算。它不比乘以二更依赖于平
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
关于架构 XXX 的重复符号有很多问题,但我没有得到我的问题的答案。在我的场景中,我使用 Cocoapod,并导入 FMDB,但是当我集成另一个第三方 SDK 时,当我构建项目时,出现如下错误: 是否
我无法编译我的 Xcode 项目,它有重复的 ParseFacebookUtilsV4 问题 这是我的苹果 Mach-O 链接器错误: duplicate symbol _llvm.cmdline i
我对使用 MFC 的内置文档 View 体系结构的必要性有疑问。我得到了一个基于对话框的旧项目,我必须在其中用框架替换主对话框并添加功能区。它有一种文档 View 架构,创建时没有内置类,我更愿意在新
我正在构建一个协作创作工具,该工具允许用户共同编辑信息空间,该信息空间是节点和链接的可视化。一个客户端应用程序中所做的更改需要反映到所有其他客户端中。由于它是可视化的,因此可能需要经常更新潜在的大数据
如果我在 Windows(x86 和 x64)下的 .NET 上运行涉及 System.Double 的复杂计算,然后在 Mono(Linux、Unix 等)上运行,绝对有保证 以在所有情况下得到完全
当我使用 Xcode 4.6 编译我的 iPhone 应用程序时,我看到一个奇怪的错误代码: "duplicate symbols for architecture i386". 我知道这个关于文件名
我最近询问了 System.Double,并被告知计算可能因平台/架构而异。不幸的是,我找不到任何信息来告诉我这是否适用于 System.Decimal。 对于任何特定的 decimal 计算,无论平
我有一些实体,例如:Customers、Orders、Invoices。 对于它们中的每一个,我都将它们的CRUD 操作 和一些其他界面分组为:ISvcCustomerMgmt、ISvcOrderMg
这个问题有点像一个池。我们正在尝试在使用 LINQ to SQL 之类的 ORM 时确定最佳架构。我们正在定义的架构是用于其他应用程序将通过直接引用 DLL 或通过 Web 服务访问的框架。我们有 .
请就如何为 Java web 应用程序做“插件”架构提出建议。 目前我们在 Tomcat servlet 容器中使用非常简单和标准的 Spring+Hibernate+Struts 2。 (使用 ma
我是一名优秀的程序员,十分优秀!