如何在可视C++中启用 SSE4.2 指令集



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

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

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

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

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

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

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

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

MSVC 编译器有一个/arch选项,用于指定希望程序面向的最小体系结构。 像/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。

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

相关内容

  • 没有找到相关文章

最新更新