char和整数数组之间的速度差异?

时间:2008-09-26 08:08:34

标签: c arrays memory alignment sse

目前我正在处理一个视频处理软件,其中图片数据(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数组不同 - 已经采用压缩格式。那么哪个版本会更快?

4 个答案:

答案 0 :(得分:5)

如果您计划使用SSE,那么以原始大小(8位)存储数据几乎肯定是更好的选择,因为无需解压缩即可完成大量操作,即使您需要为pmaddwd解压缩或者其他类似的指令,它仍然更快,因为你必须加载更少的数据。

即使在标量代码中,加载8位或16位值也不比加载32位慢,因为movzx / movsx的速度与mov没有区别。所以你只需要节省内存,这肯定不会伤害。

答案 1 :(得分:1)

这实际上取决于您的目标CPU - 您应该阅读其规格并运行一些基准,正如大家已经建议的那样。许多因素可能会影响绩效。我想到的第一个显而易见的是你的int数组比chars数组大2到4倍,因此,如果数组足够大,你将获得更少的数据缓存命中率,这肯定会慢降低表现。

答案 2 :(得分:-1)

相反,打包和解包是CPU命令很昂贵。

如果你想进行大量的随机像素操作 - 将它变成int数组会更快,这样每个像素都有自己的地址。

但如果你顺序遍历图像,你想制作一个字符数组,这样它的大小很小,并减少出现页面错误的可能性(特别是对于大图像)

答案 3 :(得分:-1)

在某些情况下,Char数组可能会更慢。作为一般的经验法则,原始字大小是最好的,它很可能是4字节(32位)或8字节(64位)。更好的是将所有内容与16字节对齐,就像您已经完成的那样......如果您使用SSE指令(MOVNTA),这将启用更快的副本。如果你只关心移动物品,这将比阵列使用的类型产生更大的影响......