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

问题描述 投票:0回答:3

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

在关于BRIEF描述符的论文中写道,可以加快速度:

“Brief 描述符使用汉明距离,这在现代 CPU 上可以非常快地完成,这些 CPU 通常提供特定指令来执行 XOR 或位计数 操作,与最新的SSE指令集的情况相同。”

启用SSE4.2后,速度应该会加快。我的问题只是如何在 Visual C++ 中执行此操作?

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

opencv visual-c++ hammingweight sse4
3个回答
6
投票

不幸的是,事实并非如此。

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

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


3
投票

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。”

如果您不想依赖优化器和库实现来查找最佳指令,也可以使用内置指令的内部函数。


0
投票

您可以以未记录的方式将

/arch:
选项作为
/d2...
选项传递。喜欢
/d2archAVX

/d2archSSE42
以这种方式被接受。这是唯一可能的选项,无法通过文档提供
/arch:

© www.soinside.com 2019 - 2024. All rights reserved.