这里看看环部分 - http://en.wikipedia.org/wiki/ARM_architecture
基本上你会想是这样的:
void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"\t mov r3, #0\n"
"Lloop:\n"
"\t cmp r3, %2\n"
"\t bge Lend\n"
"\t ldrb r4, [%0, r3]\n"
"\t add r4, r4, %3\n"
"\t strb r4, [%1, r3]\n"
"\t add r3, r3, #1\n"
"\t b Lloop\n"
"Lend:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r3", "r4");
}
更新:
An d这是NEON版本:
void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"\t mov r4, #0\n"
"\t vdup.8 d1, %3\n"
"Lloop2:\n"
"\t cmp r4, %2\n"
"\t bge Lend2\n"
"\t vld1.8 d0, [%0]!\n"
"\t vqadd.s8 d0, d0, d1\n"
"\t vst1.8 d0, [%1]!\n"
"\t add r4, r4, #8\n"
"\t b Lloop2\n"
"Lend2:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r4", "d1", "d0");
}
所以这个NEON版本一次只能做8个。但它不检查numPixels
是否可以被8整除,所以你肯定会这样做,否则事情就会出错!无论如何,这只是向您展示可以做什么的开始。注意相同数量的指令,但是一次对八个像素的数据采取行动。哦,那里也饱和了,我想你会想要。
像这样的功能也可以使用OpenGL ES和片段着色器来实现。如果这适用于您的问题。这会让你免费并行化,就像Matt所说的那样使用NEON。 – Arne 2011-12-23 11:20:33
你肯定可以肯定地使用OpenGL ES。取决于你在做什么,如果你想把它作为一个依赖关系。 – mattjgalloway 2011-12-23 12:25:40
如果OpenGL ES需要将计算的总和返回给CPU,则速度可能不够快。 iPad GPU不是为了有效执行此任务而制造的。 – Etan 2011-12-23 12:35:49