char和整数数组之间的速度差异?
目前,我正在使用一种视频处理软件,其中图像数据(8位带符号和无符号)存储在16个对齐整数数组中,这些整数分配为
__declspec(align(16)) int *pData = (__declspec(align(16)) int *)_mm_malloc(width*height*sizeof(int),16);
通常,如果其中一个使用了有符号/无符号字符数组,它是否可以实现更快的读写速度?
__declspec(align(16)) int *pData = (__declspec(align(16)) unsigned char *)_mm_malloc(width*height*sizeof(unsigned char),16);
我对缓存行大小和数据传输优化知之甚少,但至少我知道这是一个问题。除此之外,将来还会使用SSE,在这种情况下,与int数组不同的char数组已经采用打包格式。那么哪个版本会更快?
解决方案
相反,打包和拆包是CPU命令的昂贵选择。
如果要进行大量的随机像素运算,则将其设置为int数组的速度更快,以便每个像素都有自己的地址。
但是,如果我们顺序地遍历图像,则需要创建一个chars数组,以使其尺寸较小并减少出现页面错误的机会(尤其是大图像)
如果我们打算使用SSE,则几乎可以肯定地选择以其原始大小(8位)存储数据,因为无需卸载即可完成操作负荷,即使我们需要为pmaddwd或者其他类似程序进行解压缩指令,它仍然更快,因为我们必须加载较少的数据。
即使在标量代码中,加载mov的速度与mov的速度没有区别,加载8位或者16位的值也不会比加载32位的速度慢。因此,我们只需要保存内存即可,这肯定不会造成伤害。
它实际上取决于目标CPU-我们应该阅读其规格并按照每个人的建议运行一些基准测试。许多因素都可能影响性能。我想到的第一个显而易见的情况是,整数数组是字符数组的2到4倍,因此,如果数组足够大,则数据缓存命中次数会减少,这肯定会减慢速度降低性能。
在某些情况下,字符数组可能会变慢。作为一般的经验法则,本机字长是最好的选择,它很可能是4字节(32位)或者8字节(64位)。更好的是,将所有内容都对齐到16个字节,如果我们使用SSE指令(MOVNTA),则可以更快地进行复制。如果我们只关心移动项目,这将比数组使用的类型产生更大的影响...