4

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

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

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

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

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

4

2 回答 2

6

不幸的是,它不是那样工作的。

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

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

于 2012-04-17T11:07:07.373 回答
3

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

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

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

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

于 2021-02-14T20:05:41.663 回答