【发布时间】: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