Apple A4之NEON技术——颜色混合算法
2010-10-06 23:32
316 查看
本人之前在介绍Apple's OpenCL的时候出过一份代码,是用于图像半透明算法的,并且提供了OpenCL版本与x86的SSE版本。 这次,俺将提供ARMv7架构的NEON版本进行对照。通过对比,各位可以清晰地看到ARMv7架构具有比传统的x86拥有更强的计算能力。在处理器拥有相同的流水线特征的情况下,ARMv7能提供更精简,更强大的计算性能。
首先提供初始化以及应用的主程序:
上述代码含有iOS的Objective-C接口,但是这并不会影像我们的阅读理解。
下面是外部接口ZennySetCoefficient
这个接口用于将混合系数分别传给q2、q3寄存器
下面则是核心的利用NEON技术的代码:
代码很简短,但是提供的功能已经很强大了。
首先提供初始化以及应用的主程序:
#define IMAGE_X_PIXELS 176 #define IMAGE_Y_PIXELS 144 extern void ZennySetCoefficient(const float *coef0, const float *coef1); extern void ZennyBlend(const float *image1, const float *image2, float *dst, size_t length); static inline size_t address_align(size_t addr, int nBytesAligned) { return (addr & ~(nBytesAligned - 1)) + nBytesAligned; } - (IBAction)v128LoadButtonPressed:(id)sender { const int count = IMAGE_X_PIXELS * IMAGE_Y_PIXELS; const float coef1 = 0.4f, coef2 = 0.6f; float *pOrgSrc1 = (float*)malloc(count * sizeof(*pOrgSrc1) + 64); float *pOrgSrc2 = (float*)malloc(count * sizeof(*pOrgSrc1) + 64); float *pOrgDst = (float*)malloc(count * sizeof(*pOrgSrc1) + 64); float *pValidateDst = (float*)malloc(count * sizeof(*pOrgSrc1)); float *pSrc1 = (float*)address_align((size_t)pOrgSrc1, 64); float *pSrc2 = (float*)address_align((size_t)pOrgSrc2, 64); float *pDst = (float*)address_align((size_t)pOrgDst, 64); for(int i = 0; i < count; i++) { pSrc1[i] = rand(); pSrc2[i] = rand(); } // Prepare for validation for(int i = 0; i < count; i++) pValidateDst[i] = pSrc1[i] * coef1 + pSrc2[i] * coef2; ZennySetCoefficient(&coef1, &coef2); ZennyBlend(pSrc1, pSrc2, pDst, count); // Validate for(int i = 0; i < count; i++) { if(pValidateDst[i] != pDst[i]) { [outputText setText:[NSString stringWithFormat:@"Error ocurred @: %d", i]]; return; } } [outputText setText:@"Successful!"]; free(pOrgSrc1); free(pOrgSrc2); free(pOrgDst); free(pValidateDst); }
上述代码含有iOS的Objective-C接口,但是这并不会影像我们的阅读理解。
下面是外部接口ZennySetCoefficient
// extern void ZennySetCoefficient(const float *coef0, const float *coef1); _ZennySetCoefficient: vld1.32 {d4[], d5[]}, [r0] vld1.32 {d6[], d7[]}, [r1] bx lr
这个接口用于将混合系数分别传给q2、q3寄存器
下面则是核心的利用NEON技术的代码:
// extern void ZennyBlend(const float *image1, const float *image2, float *dst, size_t length); _ZennyBlend: READ_CALC_WRITE: vld2.32 {d0, d1}, [r0]! vld2.32 {d2, d3}, [r1]! vmul.f32 q0, q0, q2 vmla.f32 q0, q1, q3 vst2.32 {d0, d1}, [r2]! subs r3, r3, #4 bne _ZennyBlend bx lr
代码很简短,但是提供的功能已经很强大了。
相关文章推荐
- PS图层混合算法之五(饱和度,色相,颜色,亮度)
- Apple A4之NEON技术——NEON寄存器架构
- PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)
- PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)
- PS图层混合算法之五(饱和度,色相,颜色,亮度)
- 网页抽取技术和算法
- 对比感知技术的硬件或者算法的关键技术指标
- 两种透明颜色混合后的颜色
- 【图像算法】彩色图像分割专题一:颜色空间3(部分源码)
- 【编程珠玑】第八章 算法设计技术
- 从ACM跳槽 由算法转技术
- VoIP技术(2)--语音编码算法-1
- 【编程珠玑-读书笔记】算法设计技术—以求解"最大连续子序列和"为例
- 实现RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法
- 火云开发课堂 - 《Shader从入门到精通》系列 第五节:在Shader中将纹理色与颜色值混合
- 下拦菜单技术演示---修改文本颜色
- RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法(java实现)
- 技术,基础,算法,何为何?
- 用混合遗传算法求解物流配送路径
- cocos2d-x 颜色混合