SIMD和多核心编程时的一些总结。

来源:互联网 发布:知的草书写法 编辑:程序博客网 时间:2024/05/01 10:49

1  在计算过程中不涉及输出内存的数据时,应使用_mm*_stream_*(直接写入内存)代替_mm*_store_*,例如:

for( i=0; i<256; i+=4 )

{

    ymm0=_mm256_load_pd(a+i);

    ymm1=_mm256_load_pd(b+i);

    ymm2=_mm256_add_pd(ymm0,ymm1);

    _mm256_stream_pd(c+i,ymm2);

}

若计算过程中还要使用输出内存中的数据,则应使用_mm*_store_*,例如:

for( i=0; i<256; i+=4 )

{

    ymm0=_mm256_load_pd(a+i);

    ymm1=_mm256_load_pd(b+i);

    ymm2=_mm256_load_pd(c+i);

    ymm3=_mm256_add_pd(ymm2,_mm256_mul_pd(ymm0,ymm1));

    _mm256_store_pd(c+i,ymm3);

}   

2  多个核心之间共享数据的使用时间应尽可能的靠近,这样可以比较充分的利用L3共享缓存提高带宽。

3  如果同时使用SIMD和MC,则应该先进入BIOS关掉超线程,默认情况下每个核心有两个线程,但却只有一组物理SIMD寄存器。这样多个线程之间就会存在额外的上下文切换开销,往往得不偿失。

4  有时候会重复使用某些小的数据块,而该数据块中的字节数不足以映射到整数个缓存行,为了避免缓存行被使用前就被污染使用固定大小的数组+PADD扩展至整倍数的缓存行大小。

5  有些情况下,同时使用SIMD和MC的性能甚至不如只使用SIMD或者MC,这时应优先考虑SIMD,应为其更轻量级,且不存在多个核心之间的同步开销。

原创粉丝点击