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_*,例如:
本文总结了在进行SIMD(单指令多数据)和多核心编程时的一些关键点,包括:1) 使用_mm*_stream_*优化不涉及输出内存的数据;2) 确保共享数据在多核间的使用时间接近以充分利用L3缓存;3) 关闭超线程以避免线程间SIMD寄存器的上下文切换开销;4) 通过数组和PADD扩展确保数据块对齐到缓存行大小;5) 在性能对比中,当SIMD与多核并用效果不佳时,优先考虑SIMD,因其更轻量且无同步开销。
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_*,例如:
750

被折叠的 条评论
为什么被折叠?