【发布时间】:2013-10-28 19:30:28
【问题描述】:
我有以下将隔行扫描网络摄像头 YUYV 转换为灰色的 C 代码:
void convert_yuyv_to_y(const void *src, char *dest) {
int x, y;
char *Y, *gray;
//get only Y component for grayscale from (Y1)(U1,2)(Y2)(V1,2)
for (y = 0; y < CAM_HEIGHT; y++) {
Y = src + (CAM_WIDTH * 2 * y);
gray = dest + (CAM_WIDTH * y);
for (x=0; x < CAM_WIDTH; x += 2) {
gray[x] = *Y;
Y += 2;
gray[x + 1] = *Y;
Y += 2;
}
}
}
有没有办法通过一些霓虹灯指令来优化这样的功能?
【问题讨论】:
-
您是否有一个基准框架,以便您可以衡量任何更改的好处?
-
基本方法:一次交错读取2个寄存器,只存储一个:
vld2.8 { d0, d1}, [r0]!; vst1.8 d0, [r1]!;高级的东西:对齐到 16 个字节,使用多个单独的路径,确保这些路径不会从相同的缓存行竞争,使用多个线程。 -
@Aki Suihkonen:您能否总结一下您的基本方法的答案,包括一些代码?
-
你也可以通过 gcc 使用 "-Wall -mfpu=neon -ftree-vectorize -ftree-vectorizer-verbose=8 -O2 -c" 来编译它。
-
我还将删除code.google.com/p/libyuv 作为另一个参考。
标签: c image-processing arm neon