目前,我正在处理一个视频处理软件,其中图片数据(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将在未来使用,在这种情况下,char数组--与int数组不同--已经是打包格式的。那么哪个版本会更快呢?
发布于 2008-09-26 08:31:19
如果您计划使用SSE,那么将数据存储在其本机大小(8位)几乎肯定是一个更好的选择,因为无需解包就可以完成大量的操作,而且即使您需要为pmaddwd或其他类似的指令解压缩,它仍然更快,因为您必须加载更少的数据。
即使在标量代码中,加载8位或16位值也不会比加载32位慢,因为movzx/movsx在速度上与mov没有什么不同。所以你只需要保存记忆,这肯定不会伤害到你。
发布于 2008-09-26 08:53:28
它确实取决于您的目标CPU --您应该阅读它的规范并运行一些基准测试,就像每个人已经建议的那样。影响绩效的因素很多。我想到的第一个显而易见的问题是,您的ints数组比一个字符数组大2到4倍,因此,如果数组足够大,您将得到较少的数据缓存命中,这肯定会降低性能。
发布于 2008-09-26 08:28:42
相反,打包和解压缩是昂贵的CPU命令。
如果您想要进行大量的随机像素操作,那么让它成为一个int数组以使每个像素都有自己的地址会更快。
但是,如果您按顺序遍历您的图像,您希望生成一个chars数组,这样它的大小就很小,并且减少了发生页面错误的可能性(特别是对于大型图像)。
https://stackoverflow.com/questions/138245
复制相似问题