5

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

4

4 回答 4

5

如果您打算使用 SSE,则以本机大小(8 位)存储数据几乎肯定是更好的选择,因为无需解包即可完成大量操作,即使您需要为 pmaddwd 或其他类似文件解包说明,它仍然更快,因为您必须加载更少的数据。

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

于 2008-09-26T08:31:19.217 回答
1

这真的取决于你的目标 CPU——你应该阅读它的规格并运行一些基准测试,正如每个人都已经建议的那样。许多因素可能会影响性能。我想到的第一个明显的问题是您的整数数组比字符数组大 2 到 4 倍,因此,如果数组足够大,您将获得更少的数据缓存命中,这肯定会减慢降低性能。

于 2008-09-26T08:53:28.227 回答
-1

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

如果您想进行大量随机像素操作 - 将其设置为 int 数组会更快,这样每个像素都有自己的地址。

但是,如果您依次遍历图像,则需要创建一个 chars 数组,使其尺寸较小并减少出现页面错误的机会(尤其是对于大图像)

于 2008-09-26T08:28:42.390 回答
-1

在某些情况下,字符数组可能会更慢。作为一个非常普遍的经验法则,本机字长是最好的选择,它很可能是 4 字节(32 位)或 8 字节(64 位)。更好的是像您已经完成的那样将所有内容对齐到 16 字节...如果您使用 SSE 指令 (MOVNTA),这将实现更快的复制。如果您只关心移动项目,这将比数组使用的类型产生更大的影响......

于 2009-02-03T12:15:20.393 回答