C 将32位数组复制到16位数组的最快方法是什么?

C 将32位数组复制到16位数组的最快方法是什么?,c,memcpy,C,Memcpy,将32位数组复制到16位数组的最佳方法是什么 我知道“memcpy”使用硬件指令。但是有没有标准的函数来复制每个元素中“改变大小”的数组 我对armv7(cortex A8)使用gcc uint32_t tab32[500]; uint16_t表16[500]; 对于(int i=0;i如果不需要修改数据,可以在32位数组上使用指向uint16\t的指针。它假设裸内存作为16位无符号int的数组是有意义的 编辑:等等,问题中有点不清楚没有标准函数可以做到这一点,主要是因为它非常特定于您的应用程序

将32位数组复制到16位数组的最佳方法是什么

我知道“memcpy”使用硬件指令。但是有没有标准的函数来复制每个元素中“改变大小”的数组

我对armv7(cortex A8)使用gcc

uint32_t tab32[500];
uint16_t表16[500];

对于(int i=0;i如果不需要修改数据,可以在32位数组上使用指向uint16\t的指针。它假设裸内存作为16位无符号int的数组是有意义的


编辑:等等,问题中有点不清楚

没有标准函数可以做到这一点,主要是因为它非常特定于您的应用程序


如果您知道
tab32
中的整数足够小,可以放入uint16\t中,那么您的问题中的代码可能是您能得到的最好的(如果编译器能够优化某些东西,那么它将完成其余的工作)。

在带有Neon指令集的ARM cortex A8上,最快的方法使用交错读/写指令:

vld2.16 {d0,d1}, [r0]!
vst1.16 {d0}, [r1]!
或饱和指令,将32位整数向量转换为16位整数向量


这两种方法都可以在c语言中使用gcc内部代码。gcc也可以自动向量化一个精心编写的c代码,只使用这些特定的指令。这基本上需要与这些指令和c代码的所有副作用一一对应。

使用memcpy将非常有用在我看来,这是最快的方法。memcpy是针对每种架构分别进行优化的,所以你应该是优秀的

另一方面,由于ARM中的寄存器是32位的,而16位值在后端是零/符号扩展到32位的。因此,我认为,将它们保留为32位数组,而不是将数据复制到16位数组中会更有效(您应该实际测量以做出正确的决定)

如果将传入值存储在int数组中,但每个int都有两个16位值,那么有一种方法可以节省大小并提高性能(希望如此)

For example: int[4] would look like this:
----------------------------------------------------------------
|      32bit   ||      32bit   ||      32bit   ||      32bit   |
----------------------------------------------------------------
| 16bit | 16bit|| 16bit | 16bit|| 16bit | 16bit|| 16bit | 16bit|
----------------------------------------------------------------
需要进行一些预处理(比如将值读取为char(字节),然后在int数组上进行(char*)类型转换,以便在一个插槽中存储两个值)


最后一种方法不能保证提供更好的性能,除非您的所有算法(将应用于阵列)都能与此元素布局无缝配合。可能您必须稍微修改算法才能与此数据结构配合使用。例如,某些位操作算法(and、or等)可以应用于此数据结构,而无需做太多工作。

要将32位整数放入16位插槽中,您需要大量的KY(您确定不想以另一种方式进行吗?)为什么
tab16[i]=tab32[i];
?究竟***
tab32[i]是什么
。32位数组是否在每个位置都包含16位无符号整数?我想复制所有较低的16位(有些元素有符号,有些没有符号):-1到-1,-32000到-32000,65000到65000我会指示使用
gcc-S-O2
(并检查自动矢量化优化标志的语法)。那么基本上,编译器应该能够生成至少与上述一样好的代码,甚至可能更好。然后问问自己:是否有额外的加载/存储或算术指令?是否有额外的指令来计算迭代次数?或处理不对齐的数据?这些约束中的大多数都可以提示给编译器:
out输出[0]=(uint32_t)数据[0]&0x0000ffff;
for(i=0;i<48*8;i+=8){//手动按8展开}
;将输入数据至少对齐64位等。我的循环或“控制块”中没有更多的指令:(;测试;指令)。谢谢,我希望我的(lminaro)gcc 4.7.2能很好地优化它。
For example: int[4] would look like this:
----------------------------------------------------------------
|      32bit   ||      32bit   ||      32bit   ||      32bit   |
----------------------------------------------------------------
| 16bit | 16bit|| 16bit | 16bit|| 16bit | 16bit|| 16bit | 16bit|
----------------------------------------------------------------