我使用内循环中的NDK和SIMD NEON程序集为C语言中的ARM处理器开发了一些位图处理例程。
结构如下:
for (row=0;row<height;row++){
src = &bitmap_src[row*width];
dst = &bitmap_dst[row*width];
// other pointers initting for the asm part....
color = &color_array[row*width];
light = &light_array[row*width];
__asm volatile(
// Optimized Neon assembly code. Process a row
// makes use of src, dst, color and light pointers
);
}
我对所取得的成果感到满意,并且比普通的C版本(我用作参考)快得多 现在我想在进行相同处理之前对位图进行某种空间失真。 为了做这个映射,我使用另一个数组P [],以这种方式(如果我们不进行内部处理)
bitmap_dest[row*width + col ] = bitmap_src[ P[row*width + col ] ];
由于我需要NEON部分的线性存储器访问,我预先计算了每一行:
unsigned int PP[width]; // temporary "mapped" row
for (row=0;row<height;row++){
for (col =0; col<width; col++){
//PP[col]=bitmap_src[ P[row*width + col] ];
PP[col]=bitmap_src[*(P++)]; //both lines do the same. This is faster
}
src = &PP[0]; //now the source points to the mapped row instead of the original.
dst = &bitmap_dst[row*width];
// other pointers initting for the asm part....
color = &color_array[row*width];
light = &light_array[row*width];
__asm volatile(
// Optimized Neon assembly code. Process a row
// makes use of src, dst, color and light pointers
);
}
它仍然比我在普通C中完全写的旧版本快得多,但比第一版快两倍。
我认为速度下降主要是由于缓存未命中,如果我使用直接映射而不是反向,我会有
bitmap_dest [P2 [row * width + col]] = bitmap_src [row * width + col];
这将允许我仍然线性加载源,但是必须更改商店部分并且不知道它是否值得。此外,由于映射不一定是双射的,我会失去解决方案。
所以我的问题是:知道间接数组访问是昂贵的,但仍然使用这种结构,是否有优化它的提示?