我在 Visual C++ 2010 中使用 OpenCV 中的 Brief 描述符来匹配两个图像中的点。
在关于BRIEF描述符的论文中写道,可以加快速度:
“Brief 描述符使用汉明距离,这在现代 CPU 上可以非常快地完成,这些 CPU 通常提供特定指令来执行 XOR 或位计数 操作,与最新的SSE指令集的情况相同。”
启用SSE4.2后,速度应该会加快。我的问题只是如何在 Visual C++ 中执行此操作?
另一种方法是选择另一个支持 SSE4 的编译器。例如Intel的ICC。这真的有必要吗?
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。”
如果您不想依赖优化器和库实现来查找最佳指令,也可以使用内置指令的内部函数。
您可以以未记录的方式将
/arch:
选项作为 /d2...
选项传递。喜欢/d2archAVX
。
/d2archSSE42
以这种方式被接受。这是唯一可能的选项,无法通过文档提供 /arch: