gpt4 book ai didi

c - 找出最少 3 个数字的最快方法?

转载 作者:太空狗 更新时间:2023-10-29 16:27:36 25 4
gpt4 key购买 nike

在我写的一个程序中,有 20% 的时间花在了在内循环中找出 3 个数字中的最小值,在这个例程中:

static inline unsigned int
min(unsigned int a, unsigned int b, unsigned int c)
{
unsigned int m = a;
if (m > b) m = b;
if (m > c) m = c;
return m;
}

有什么办法可以加快速度吗?我也可以使用 x86/x86_64 的汇编代码。

编辑:回复部分评论:
* 使用的编译器是 gcc 4.3.3
* 就组装而言,我只是那里的初学者。我要求在这里组装,以学习如何做到这一点。 :)
* 我有一个四核 Intel 64 运行,所以支持 MMX/SSE 等。
* 很难在此处发布循环,但我可以告诉您这是 levenshtein 算法的高度优化实现。

这是编译器为 min 的非内联版本提供的:

.globl min
.type min, @function
min:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl 16(%ebp), %ecx
cmpl %edx, %eax
jbe .L2
movl %edx, %eax
.L2:
cmpl %ecx, %eax
jbe .L3
movl %ecx, %eax
.L3:
popl %ebp
ret
.size min, .-min
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits

内联版本在 -O2 优化代码中(甚至我的标记 mrk = 0xfefefefe,在调用 min() 之前和之后)都被 gcc 优化掉了,所以我无法掌握它。

更新:我测试了 Nils, ephemient 建议的更改,但是使用 min() 的汇编版本没有明显的性能提升。但是,通过使用 -march=i686 编译程序,我得到了 12.5% 的提升,我猜这是因为整个程序正在获得 gcc 使用此选项生成的新的更快指令的好处。感谢你们的帮助。

附言- 我使用 ruby​​ 分析器来测量性能(我的 C 程序是一个由 ruby​​ 程序加载的共享库),所以我可以只花时间在 ruby​​ 程序调用的顶级 C 函数上,最终调用 min( ) 向下堆栈。请看这个question .

最佳答案

确保您使用的是适当的 -march 设置,首先。 GCC 默认不使用原始 i386 不支持的任何指令 - 允许它使用更新的指令集有时会产生很大的不同!在 -march=core2 -O2 我得到:

min:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
movl 16(%ebp), %eax
cmpl %edx, %ecx
leave
cmovbe %ecx, %edx
cmpl %eax, %edx
cmovbe %edx, %eax
ret

在这里使用 cmov 可以帮助您避免分支延迟 - 您只需传入 -march 即可在没有任何内联 asm 的情况下获得它。当内联到一个更大的函数中时,这可能会更有效率,可能只有四个汇编操作。如果您需要比这更快的东西,看看您是否可以让 SSE vector 运算在您的整体算法的上下文中工作。

关于c - 找出最少 3 个数字的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com