【发布时间】:2016-06-12 20:29:57
【问题描述】:
在Linear vs. Binary Search 文章中,有一个使用 CMOV 指令的二分查找的快速实现。我想在 VC++ 中实现这一点,因为我正在处理的应用程序依赖于二进制搜索的性能。
该实现有一些 GCC 内联汇编器,声明如下:
static int binary_cmov (const int *arr, int n, int key) {
int min = 0, max = n;
while (min < max) {
int middle = (min + max) >> 1;
asm ("cmpl %3, %2\n\tcmovg %4, %0\n\tcmovle %5, %1"
: "+r" (min),
"+r" (max)
: "r" (key), "g" (arr [middle]),
"g" (middle + 1), "g" (middle));
// Equivalent to
// if (key > arr [middle])
// min = middle + 1;
// else
// max = middle;
}
return min;
}
我想将此 GCC 汇编器转换为与 Microsoft Visual Studio 兼容的汇编器,但作为 GCC 新手不知道从哪里开始。
任何人都可以提供帮助,或者至少解释一下 GCC 内联汇编器吗?蒂亚!
【问题讨论】:
-
简短回答:不要这样做。将它保存在 C 中,让编译器处理它。
-
你用 msvc 2015 u3 试过了吗?在您的情况下,它应该为该代码生成 cmovs(通过新的优化器)
-
更快的序列可能是
cmpl min,max; adc $0,middle。不确定它是否正确,可能您需要改为cmpl max,min。 -
Update 3 目前是候选发布版(截至 6 月 7 日),但可以下载。 visualstudio.com/downloads/visual-studio-prerelease-downloads
-
@RossRidge 是的,我已经分析过了,这是一个关键瓶颈。是的,它的排序值。是的。我已经对其进行了分析。通过从 C# 泛型迁移到 C++ 模板和 P/Invoke,我已经获得了 100 倍的加速。额外的2折会很好;)
标签: c++ visual-studio gcc visual-c++ assembly