相关疑难解决方法(0)

我的编译器在做什么?(优化memcpy)

我正在使用VC++ 2010中的以下设置编译一些代码:/ O2/Ob2/Oi/Ot

但是我在理解生成的程序集的某些部分时遇到了一些问题,我在代码中提出了一些问题作为注释.

此外,现代cpu通常建议使用什么预取距离?我可以在我自己的cpu上进行测试,但我希望能够在更广泛的cpu上运行良好的价值.也许可以使用动态预取距离?

< - 编辑:

我很惊讶的另一件事是编译器不以某种形式交错movdqa和movntdq指令?由于这些指令在某种意义上与我的理解不同步.

此代码在预取时也假设32字节高速缓存行,但高端cpus似乎有64字节高速缓存行,因此可能会删除2个预取.

- >

void memcpy_aligned_x86(void* dest, const void* source, size_t size)
{ 
0052AC20  push        ebp  
0052AC21  mov         ebp,esp  
 const __m128i* source_128 = reinterpret_cast<const __m128i*>(source);

 for(size_t n = 0; n < size/16; n += 8) 
0052AC23  mov         edx,dword ptr [size]  
0052AC26  mov         ecx,dword ptr [dest]  
0052AC29  mov         eax,dword ptr [source]  
0052AC2C  shr         edx,4  
0052AC2F  test        edx,edx  
0052AC31  je          copy+9Eh (52ACBEh)  
 __m128i xmm0 = _mm_setzero_si128();
 __m128i xmm1 = _mm_setzero_si128();
 __m128i xmm2 = _mm_setzero_si128(); …
Run Code Online (Sandbox Code Playgroud)

c++ assembly sse compiler-optimization

9
推荐指数
1
解决办法
4009
查看次数

标签 统计

assembly ×1

c++ ×1

compiler-optimization ×1

sse ×1