我在Visual C ++ 2010中使用OpenCV中的BRIEF描述符来匹配两个图像中的点。
关于Brief-descriptor的the paper写道,可以加快速度:
“Brief描述符使用汉明距离,这可以在现代CPU上非常快速地完成,这些CPU通常提供执行XOR或位数的特定指令 操作,就像最新的SSE指令集一样。“
启用SSE4.2后,应该加快速度。我的问题只是我在Visual C ++中如何做到这一点?
另一种方法是选择另一个支持SSE4的编译器。例如英特尔的ICC。这真的有必要吗?
答案 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。”
如果您不想依赖优化器和库实现来查找最佳指令,您还可以将内在函数用于内置指令。