Tag: 组件

为什么在function序言/尾声中使用ebp?

前段时间我正在尝试编写汇编程序并将其与C程序链接,我发现我可以跳过标准的C调用序言尾声 push ebp mov ebp, esp (sub esp, 4 … mov esp, ebp) pop ebp 只是跳过这一切,只需通过esp ,就像 mov eax, [esp+4] ;; take argument mov [esp-4], eax ;; use some local variable storage 它似乎工作得很好。 为什么使用这个ebp – 可能更快地通过ebp解决或者是什么?

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

在我写的一个程序中,在这个例程中,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 […]

为什么复杂的memcpy / memset优越?

在调试时,我经常进入memcpy和memset的手写程序集实现。 这些通常使用流指令(如果可用),循环展开,对齐优化等实现…我最近也遇到了由于glibc中的memcpy优化而导致的“错误” 。 问题是:为什么硬件制造商(英特尔,AMD)不能优化具体情况 rep stos 和 rep movs 被认可,并尽可能快地填写和复制他们自己的架构?

在GCC中生成没有cmp指令的循环

我有一些紧凑的循环,我正在尝试使用GCC和内在函数进行优化。 考虑例如以下function。 void triad(float *x, float *y, float *z, const int n) { float k = 3.14159f; int i; __m256 k4 = _mm256_set1_ps(k); for(i=0; i<n; i+=8) { _mm256_store_ps(&z[i], _mm256_add_ps(_mm256_load_ps(&x[i]), _mm256_mul_ps(k4, _mm256_load_ps(&y[i])))); } } 这会产生这样的主循环 20: vmulps ymm0,ymm1,[rsi+rax*1] 25: vaddps ymm0,ymm0,[rdi+rax*1] 2a: vmovaps [rdx+rax*1],ymm0 2f: add rax,0x20 33: cmp rax,rcx 36: jne 20 但是cmp指令是不必要的。 而不是让rax从零开始并在sizeof(float)*n处完成,我们可以将基本指针( rsi […]

高效的4×4矩阵乘法(C vs汇编)

我正在寻找一种更快,更棘手的方法来将C中的两个4×4矩阵相乘。我目前的研究主要集中在具有SIMD扩展的x86-64汇编上。 到目前为止,我已经创建了一个函数,比一个简单的C实现快了大约6倍,这超出了我对性能改进的期望。 不幸的是,只有在没有使用优化标志进行编译时(GCC 4.7),这种情况才会成立。 随着-O2 ,C变得更快,我的努力变得毫无意义。 我知道现代编译器利用复杂的优化技术来实现几乎完美的代码,通常比巧妙的手工assembly更快。 但在少数性能关键的情况下,人类可能会尝试使用编译器争取时钟周期。 特别是,当一些支持现代ISA的数学可以被探索时(就像我的情况一样)。 我的函数如下(AT&T语法,GNU汇编程序): .text .globl matrixMultiplyASM .type matrixMultiplyASM, @function matrixMultiplyASM: movaps (%rdi), %xmm0 # fetch the first matrix (use four registers) movaps 16(%rdi), %xmm1 movaps 32(%rdi), %xmm2 movaps 48(%rdi), %xmm3 xorq %rcx, %rcx # reset (forward) loop iterator .ROW: movss (%rsi), %xmm4 # Compute four values (one row) […]

函数调用循环比空循环快

我将一些程序集与一些c链接起来测试函数调用的成本,使用以下程序集和c源代码(分别使用fasm和gcc) 部件: format ELF public no_call as “_no_call” public normal_call as “_normal_call” section ‘.text’ executable iter equ 100000000 no_call: mov ecx, iter @@: push ecx pop ecx dec ecx cmp ecx, 0 jne @b ret normal_function: ret normal_call: mov ecx, iter @@: push ecx call normal_function pop ecx dec ecx cmp ecx, 0 jne @b […]