如何在Visual C ++中启用SSE4.2指令集?

时间:2012-04-17 09:05:37

标签: visual-c++ opencv sse4

我在Visual C ++ 2010中使用OpenCV中的BRIEF描述符来匹配两个图像中的点。

关于Brief-descriptor的the paper写道,可以加快速度:

  

“Brief描述符使用汉明距离,这可以在现代CPU上非常快速地完成,这些CPU通常提供执行XOR或位数的特定指令   操作,就像最新的SSE指令集一样。“

启用SSE4.2后,应该加快速度。我的问题只是我在Visual C ++中如何做到这一点?

另一种方法是选择另一个支持SSE4的编译器。例如英特尔的ICC。这真的有必要吗?

2 个答案:

答案 0 :(得分:5)

不幸的是,它并没有像那样工作。

可以告诉C / C ++编译器在项目中使用特定的指令集 - > C / C ++ - >代码生成 - >启用增强指令集。但它几乎没有任何作用,在你的情况下,绝对没有。这是因为某些CPU指令无法从C语句中轻松访问。有些编译器(比如英特尔)在这方面比其他编译器更好,但是对于你想要实现的目标,没有一个编译器足够聪明。

您需要做的是找到特定的算法,学习SSE指令并手动用这些指令重写算法。您可以使用纯汇编编写,或使用可以从C / C ++调用的intrinsic函数,并在编译时发出SSE指令。

答案 1 :(得分:2)

MSVC 编译器有一个 /arch 选项,用于指定您希望程序定位的最低架构。将它设置为 /arch:SSE2 会告诉编译器假设 CPU 支持 SSE2 指令,并且只要优化器确定它合适,它就会自动使用它们。

但是,MSVC 没有 /arch:SSE4/arch:SSE42 选项。对标准库实现的一瞥表明 /arch:AVX/arch:AVX2 也暗示了 SSE4.2。例如,C++20 库函数 std::popcount 的 MSVC 实现将对处理器进行运行时检查,以查看它是否可以使用 SSE4.2 popcnt 指令。但是,如果您以 AVX 为目标,它会跳过运行时检查并假设处理器支持它。

我认为 gcc 和 clang 确实有启用 SSE4 和 SSE4.2 的特定选项。 更新: Peter Cordes 在评论中确认:“要专门启用 popcnt,-mpopcnt,或为 SSE4.2 -msse4.2 启用 popcnt。”

如果您不想依赖优化器和库实现来查找最佳指令,您还可以将内在函数用于内置指令。