相关疑难解决方法(0)

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或?

以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 assembly micro-optimization

109
推荐指数
1
解决办法
4万
查看次数

rep stosb指令如何比等效循环执行得更快?

指令如何rep stosb比这段代码执行得更快?

    Clear: mov byte [edi],AL       ; Write the value in AL to memory
           inc edi                 ; Bump EDI to next byte in the buffer
           dec ecx                 ; Decrement ECX by one position
           jnz Clear               ; And loop again until ECX is 0
Run Code Online (Sandbox Code Playgroud)

在所有现代CPU上都能保证这一点吗?我是否应该总是喜欢使用rep stosb而不是手动编写循环?

optimization performance x86 assembly micro-optimization

13
推荐指数
2
解决办法
6251
查看次数

_mm_store_si128抛出异常

所以我一直在尝试自己学习SEE优化,我不太了解它,我认为一个简单的函数只是将内存归零很容易实现,所以我继续尝试自己实现它.

这是零内存函数,它从缓冲区开始循环到缓冲区结束,并使用_mm_store_si128将其清零.

bool zeromem( byte * _dest, uint _sz )
{
    if ( _dest == nullptr )
        return false;
    __m128i zero = _mm_setzero_si128( );

    for ( auto i = rcast<__m128i*>( _dest ),
          end = rcast<__m128i*>( _dest + _sz );
          i < end; ++i )
    {
        _mm_store_si128( i, zero );
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

抛出异常: 即使指针不是0x00000,也会发生访问冲突(0x00000).

我做的测试只是分配1024字节的内存,然后调用zeromem.

在第一次迭代时抛出异常.

c++ sse simd

2
推荐指数
1
解决办法
633
查看次数

标签 统计

assembly ×2

micro-optimization ×2

optimization ×2

performance ×2

x86 ×2

c++ ×1

simd ×1

sse ×1