相关疑难解决方法(0)

x86的MOV真的可以"免费"吗?为什么我不能重现这个呢?

我一直看到人们声称MOV指令可以在x86中免费,因为寄存器重命名.

对于我的生活,我无法在一个测试用例中验证这一点.每个测试用例我尝试揭穿它.

例如,这是我用Visual C++编译的代码:

#include <limits.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
    unsigned int k, l, j;
    clock_t tstart = clock();
    for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j)
    {
        ++k;
        k = j;     // <-- comment out this line to remove the MOV instruction
        l += j;
    }
    fprintf(stderr, "%d ms\n", (int)((clock() - tstart) * 1000 / CLOCKS_PER_SEC));
    fflush(stderr);
    return (int)(k + j + l);
}
Run Code Online (Sandbox Code Playgroud)

这为循环生成以下汇编代码(随意生成这个你想要的;你显然不需要Visual C++):

LOOP:
    add edi,esi
    mov …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly cpu-registers micro-optimization

23
推荐指数
2
解决办法
2113
查看次数

AVX/SSE版xorshift128 +

我正在努力制作最快的高质量RNG.阅读http://xorshift.di.unimi.it/,xorshift128 +似乎是一个不错的选择.C代码是

#include <stdint.h>
uint64_t s[ 2 ];

uint64_t next(void) { 
    uint64_t s1 = s[ 0 ];
    const uint64_t s0 = s[ 1 ];
    s[ 0 ] = s0;
    s1 ^= s1 << 23; // a
    return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c
}
Run Code Online (Sandbox Code Playgroud)

我不是SSE/AVX专家,但我的CPU支持SSE4.1/SSE4.2/AVX/F16C/FMA3/XOP指令.你怎么能用这些来加速这段代码(假设你想要制作数十亿这样的随机数),那么在实践中这个加速的预期限制是多少?

c performance sse avx

10
推荐指数
2
解决办法
3371
查看次数

标签 统计

c ×2

assembly ×1

avx ×1

cpu-registers ×1

micro-optimization ×1

performance ×1

sse ×1

x86 ×1