- 主题:有没有什么SIMD的方法来优化这种代码
可以试试mask_load mask_store指令
比如8位的
_mm_mask_loadu_epi8
_mm_mask_storeu_epi8
【 在 allegro 的大作中提到: 】
: 代码如下:
: [code=c]
: void f(uint64_t flag, const uint8_t *src, uint8_t *dst)
: ...................
--
FROM 106.120.201.*
不同的flag有不同数据引用地址,不适合simd
maskmove有人试验过比iflelse还要慢
【 在 allegro 的大作中提到: 】
: 代码如下:
: [code=c]
: void f(uint64_t flag, const uint8_t *src, uint8_t *dst)
: ...................
--
FROM 139.159.170.*
编译优化,cpu的指令预测优化也好,都有一个基本前提:就是可预测性。
就拿你的例子来说,如果if大部分判断结果是一致的,那么就有优化可能。
如果没有规律,mask就需要逐位判断,simd的性能可能变得会更差。
【 在 allegro 的大作中提到: 】
: 代码如下:
:
: void f(uint64_t flag, const uint8_t *src, uint8_t *dst) { int dstByteOff = 0; int srcByteOff = 0; for(int b = 0; b < 64; ++b){ if(flag & (UINT64_C(1) << b)){ dst[dstByteOff++] = 0; } else{ dst[dstByteOff++] = src[srcByteOff++]; } } }
: ...................
--来自微微水木3.5.12
--
FROM 39.144.44.*
flag每四个一组,分别和1,3,7,15and,用pshufb查表获得其每一个的和,那就是它们取值的位置
至于赋0,flag和1,2,4,8做and,为零就置零
【 在 allegro 的大作中提到: 】
: 代码如下:
: [code=c]
: void f(uint64_t flag, const uint8_t *src, uint8_t *dst)
: ...................
--
FROM 123.117.32.*