【问题标题】:Is it safe to compile one source with SSE2 another with AVX architecture?用 SSE2 编译一个源代码是否安全,另一个用 AVX 架构编译?
【发布时间】:2015-03-30 23:30:00
【问题描述】:

我正在使用 AVX 内在函数,但由于除了基于 _mm256 的内在函数之外的所有内容,MSVC 都会生成非 vex 指令,因此我需要使用 /arch:AVX 编译整个源代码。项目的其余部分是使用 /arch:SSE2 编译的,因此它可以在较旧的 CPU 上运行,我正在手动检查 AVX 是否可用。

包含 AVX 代码(为 AVX 编译)的源包括一个巨大的模板库和其他东西,只是为了有定义。编译器/链接器是否有可能决定使用 AVX 指令实例化某些模板,仅仅因为它也包含在此源中?在这种情况下,它会在非 AVX 处理器上崩溃

【问题讨论】:

  • 您最好不要在具有不同编译选项的模块之间共享 C++-ish 内容,以免违反单一定义规则。像对待 DLL 一样对待它,使用纯 C 接口来跨越边界,除了各种模块没有自己的外部链接命名空间,因此您在内部使用 C++ 的能力也受到限制。
  • 我创建了一个测试项目,希望能回答你的问题,但它的行为不像我预期的那样(模板似乎被实例化,认为它们不需要)......我应该回答这个问题几个小时,或者可能会提出一个新的(有点不同的)问题......
  • 谢谢各位。问题是,如果可能/容易的话,我会做经典的“C”事情,但它只是依赖于许多定义和东西,所以这是很成问题的。而所有这些混乱只是因为编译器没有任何方法可以指定我想要“vex”指令......@Marc.2377 请让我知道你发现了什么。
  • 当然。顺便说一句,您是通过命令行编译还是使用 Visual Studio 编译?
  • 两者。还可以通过 LLVM 在 Mac 上使用,并尝试使用 Intel Compiler。

标签: visual-c++ sse intrinsics avx


【解决方案1】:

编译器/链接器是否有可能决定实例化 一些带有 AVX 指令的模板,只是因为它已被包含在内 也在这个来源中?

是的,它可能会发生,如我的linked question 所示。查看那里给出的(其他)好的答案。

我首选的解决方法是修改模板以包含一个有区别的参数,但如果它真的是一个“巨大的库”可能会太麻烦,就像你在自己的答案中提到的使用全局定义一样。

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多