如果您多次执行此类操作,这只会有所帮助。我使用 Agner Fog 的矢量类来做到这一点(http://www.agner.org/optimize/vectorclass.zip)。这是一个使用 SSE/AVX 的类。但是,如果您将标签 SSE 和 AVX 添加到您的问题中,您会找到最佳答案。
如果您可以确保数组是 16 字节或 32 字节对齐的,您还将获得更好的结果。在下面的代码中,它还有助于使数组的宽度等于 64(即使您只打算使用 60 个元素)或使数组的长度成为 64 的倍数。
#include <stdio.h>
#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");
}