x265 一次失败的优化case

博客探讨了C语言实现的bcast64函数与SIMD汇编实现的性能对比。通过测试发现,尽管SIMD指令集理论上更快,但在实际应用中可能并未带来预期的加速效果。文章详细分析了Intel指令周期,并手写汇编代码进行测试,结果显示性能与C代码相当。这表明在特定场景下,普通C代码的效率可能并不逊于SIMD优化。
摘要由CSDN通过智能技术生成

1 x265中的bcast64 热点函数

static void bcast64(uint8_t* dst, uint8_t val) { 
uint64_t bval = 0x0101010101010101ULL * val;
                                                 
((uint64_t*)dst)[0] = bval; 
((uint64_t*)dst)[1] = bval; 
((uint64_t*)dst)[2] = bval; 
((uint64_t*)dst)[3] = bval;
                           
((uint64_t*)dst)[4] = bval; 
((uint64_t*)dst)[5] = bval; 
((uint64_t*)dst)[6] = bval; 
((uint64_t*)dst)[7] = bval; }

看起来就是吧一个字节平铺为8个字节。

2 simd汇编实现

global bcast64
bcast64:
    prefetcht0 [rdi];
    vpbroadcastb   zmm3, rsi
    vmovdqu64 [rdi], zmm3
    ret

3 测试

结果发现跑的更慢了,查原因。x265 C代码编译后。

00000000000000a0 <_ZL7bcast64Phh>:
      a0:	40 0f b6 f6          	movzbl %sil,%esi
      a4:	48 b8 01 01 01 01 01 	movabs $0x101010101010101,%rax
      ab:	01 01 01 
      ae:	48 0f af f0          	imul   %rax,%rsi
      b2:	48 89 37             	mov    %rsi,(%rdi)
      b5:	48 89 77 08          	mov    %rsi,0x8(%rdi)
      b9:	48 89 77 10          	mov    %rsi,0x10(%rdi)
      bd:	48 89 77 18          	mov    %rsi,0x18(%rdi)
      c1:	48 89 77 20          	mov    %rsi,0x20(%rdi)
      c5:	48 89 77 28          	mov    %rsi,0x28(%rdi)
      c9:	48 89 77 30          	mov    %rsi,0x30(%rdi)
      cd:	48 89 77 38          	mov    %rsi,0x38(%rdi)
      d1:	c3                   	retq   
      d2:	0f 1f 40 00          	nopl   0x0(%rax)
      d6:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
      dd:	00 00 00 

看起来simd也比simd跑得快

查下intel文档,这些指令的指令周期

vpbroadcastb 3

vmovdqu64 7

看起来也会比C代码编译的快?

intel的普通指令集都是跑在基频,simd指令集一般比基频慢不少,通常只有1.6 - 1.9GHz。

猜测应该是这个原因,导致avx512 没有比C跑得快。

4 手写汇编测试

mov    rax, 0x101010101010101
    imul   rsi, rax
    prefetcht1 [rdi];
    mov    [rdi], rsi
    mov    [rdi+8], rsi
    mov    [rdi+16], rsi
    mov    [rdi+24], rsi
    mov    [rdi+32], rsi
    mov    [rdi+40], rsi
    mov    [rdi+48], rsi
    mov    [rdi+56], rsi
    ret

速度和C代码相当

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值