在C语言中进行类型转换后复制数组的方法更快?

我有一个二维整数数组InArray[2][60]携带2个LS字节的short数据和2个MS字节的位字段数据。 请建议一个更快的方法来提取short数据并将其复制到一个short OutArray[60] ,这是memcpy()的行。 我认为迭代每个项目不是最佳的方法。 TIA

编辑:添加代码段

 int InArray[2][60]; short OutArray[60]; for (int i=0; i < 60;i++) { OutArray[i] = (short)(InArray[0][i] & 0xffff); } 

有没有更好,更快的方法来做到这一点

如果你真的要复制一个60元素的数组,那就没关系了。

如果arrays较大和/或你正在做很多次,那么你需要看看SIMD指令集:英特尔平台上的SSEx,PPC上的Altivec ……

例如,使用SSE4,您可以使用_mm_packus_epi32()将2 * 4个32位操作数打包(并饱和)到8个16位操作数中。

您的编译器可能具有使用它们的内在函数: http : //msdn.microsoft.com/en-us/library/hh977022.aspx,http : //gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/PowerPC -AltiVec-Built_002din-Functions.html …

如果您多次这样做,这只会有所帮助。 我使用Agner Fog的vectorclass来做到这一点( http://www.agner.org/optimize/vectorclass.zip )。 这是一个使用SSE / AVX的类。 但是,如果您在标题中添加标签SSE和AVX,您将找到最佳答案。

如果可以确保数组是16字节或32字节对齐,您也会得到更好的结果。 在下面的代码中,它也有助于使数组的宽度等于64(即使你只使用60个元素)或使数组的长度为64的倍数。

 #include  #include "vectorclass.h" void foo(int InArray[2][60], short OutArray[60]) { for (int i=0; i < 60; i++) { OutArray[i] = (short)(InArray[0][i] & 0xffff); } } void foo_vec8s(int InArray[2][60], short OutArray[60]) { int i=0; for (; i <(60-8); i+=8) { Vec8s v1 = Vec8s().load(&InArray[0][i]); Vec8s v2 = Vec8s().load(&InArray[0][i+4]); Vec8s out = blend8s<0,2,4,6,8,10,12,14>(v1,v2); out.store(&OutArray[i]); } //clean up since arrays are not a multiple of 64 for (;i < 60; i++) { OutArray[i] = (short)(InArray[0][i] & 0xffff); } } int main() { int InArray[2][60]; for(int i=0; i<60; i++) { InArray[0][i] = i | 0xffff0000; } short OutArray1[60] = {0}; foo(InArray, OutArray1); for(int i=0; i<60; i++) { printf("%d ", OutArray1[i]); } printf("\n"); short OutArray2[60] = {0}; foo_vec8s(InArray, OutArray2); for(int i=0; i<60; i++) { printf("%d ", OutArray2[i]); } printf("\n"); }