Tag: neon

霓虹灯比较

根据Neon文档: 如果对于通道的比较为真,则该通道中的结果将所有位设置为1。 如果通道的比较为假,则所有位都设置为零。 返回类型是无符号整数类型。 我写了一小段代码来检查这个,我观察结果为0和-1而不是0和1.任何人都可以告诉我这背后的原因吗? 码: float c1[4] = {12.0f,12.0f,12.0f,12.0f}; float c2[4] = {13.0f,12.0f,9.0f,12.0f}; float32x4_t t1,t2; uint32x4_t rq; t1 = vld1q_f32(c1); t2 = vld1q_f32(c2); rq = vceqq_f32(t1,t2); printf(“start\n”); for( int i = 0;i < 4; i++){ printf("%d\n",rq[i]); } printf("end\n"); 结果: start 0 -1 0 -1 end

边框检查图像处理

我想在处理图像处理中的任何滤镜时注意边界条件。我正在外推边框并创建新边界。例如,我有4×3输入: //Input int image[4][3] = 1 2 3 4 2 4 6 8 3 6 9 12 //Output int extensionimage[6][5] = 1 1 2 3 4 4 1 1 2 3 4 4 2 2 4 6 8 8 3 3 6 9 12 12 3 3 6 9 12 12 我的代码: #include #include #include […]

如何在android中使用arm_acle C语言扩展

有许多使用arm neon intrinsics for android的例子,ndk甚至有一个例子。 我已经得到了没有问题的工作。 Arm还提供ACLE(Arm C语言扩展),但我可以通过示例找到几乎没有的东西。 arm文档本身仅建议包含arm_acle.h头文件,但是我仍然会出错。 谷歌几乎没有提供任何援助:)同时,搜索arm社区委员会的结果也很少。 人们不使用acle,而是选择内联汇编吗? 当我参与arm_acle.h并尝试使用__ssat()调用时,我必须进一步定义一个指令__ARM_FEATURE_CRC32,并在构建时得到错误“错误:’__ builtin_arm_qadd’未在此范围内声明” 标头看起来不包含任何依赖项,文档列表没有特定的链接依赖项。 任何建议? 还是我忽略了一些基本的东西? 附加信息:我的目标arch是armv7-a-neon,在构建时在make文件中正确检测到。 然后我进一步定义“-mfloat-abi = softfp -mfpu = neon -march = armv7”,但无济于事。 如果我撤消我的额外调试定义,我只是得到“错误:#error”ACLE内在支持未启用。“(霓虹灯支持和检测成功)搜索我的代码库,arm_acle.h头文件仅用于clang 主机工具,而arm_neon.h存在于几个预编译工具臂目录中。 正如我所说,arm_neon工作检测工作正常,运行正常,这是arm_acle组件不起作用。 搜索http://androidxref.com等在线存储库似乎表明只支持霓虹灯?

C / Renderscript / Neon内在函数之间的电池功耗 – video滤波器(Edgedetection)APK

我使用Android NDK(使用C ++ API for Renderscript)开发了3个C / RS / Neon-Intrinsics版本的video处理算法。 来自JAVA前端的NDK侧的C / RS / Neon调用将进入Native级别。 我发现由于某些原因,与C和RS版本相比,Neon版本消耗大量功率。 我使用Trepn 5.0进行功率测试。 有人可以澄清一下这些方法C,Renderscript – GPU,Neon Intrinsics的功耗水平。 哪个消费最多? 什么是RS代码的理想功耗水平?,因为GPU以较低的时钟频率运行,功耗必须更低! Renderscript API是否专注于功耗优化? video – 1920×1080(20帧) C – 11115.067 ms(0.80mW) RS – 9867.170毫秒(0.43mW) Neon Intrinsic – 9160毫秒(1.49mW)

如何使用Neon SIMD将unsigned char转换为有符号整数

如何使用Neon将数据类型uint8_t的变量转换为int32_t ? 这样做我找不到任何内在的东西。

高效的浮点比较(Cortex-A8)

有一个大的(~100 000) 浮点变量数组,并且有一个阈值(也是浮点 )。 问题是我必须将数组中的每个变量与阈值进行比较,但NEON标记传输需要很长时间(根据分析器约20个周期)。 有没有有效的方法来比较这些值? 注意:由于舍入误差无关紧要,我尝试了以下方法: float arr[10000]; float threshold; …. int a = arr[20]; // eg int t = threshold; if (t > a) {….} 但在这种情况下,我得到以下处理器命令序列: vldr.32 s0, [r0] vcvt.s32.f32 s0, s0 vmov r0, s0 <— takes 20 cycles as `vmrs APSR_nzcv, fpscr` in case of cmp r0, r1 floating point comparison 当转换发生在NEON时,无论是通过描述的方式还是浮点数来比较整数。

快速ARM NEON memcpy

我想在ARMv7核心上复制图像。 天真的实现是每行调用memcpy。 for(i = 0; i < h; i++) { memcpy(d, s, w); s += sp; d += dp; } 我知道以下内容 d, dp, s, sp, w 都是32字节对齐,所以我的下一个(仍然非常天真)实现是沿着的 for (int i = 0; i < h; i++) { uint8_t* dst = d; const uint8_t* src = s; int remaining = w; asm volatile ( "1: \n" […]

使用NEON内在函数除以浮点数

我当时正在处理一个四像素的图像,这在Android应用程序的armv7 。 我想将float32x4_t向量除以另一个向量,但其中的数字从大约0.7到3.85不等,在我看来,除法的唯一方法是使用右移,但这是一个2^n 。 此外,我是新手,所以欢迎任何建设性的帮助或评论。 例: 如何使用NEON内在函数执行这些操作? float32x4_t a = {25.3,34.1,11.0,25.1}; float32x4_t b = {1.2,3.5,2.5,2.0}; // somthing like this float32x4 resultado = a/b; // {21.08,9.74,4.4,12.55}

如何在ARM Cortex-a8中使用乘法和累加内在函数?

如何使用GCC提供的Multiply-Accumulate内在函数? float32x4_t vmlaq_f32 (float32x4_t , float32x4_t , float32x4_t); 任何人都可以解释我必须传递给这个函数的三个参数。 我的意思是源和目标寄存器以及函数返回的内容? 救命!!!

编译ARM NEON时出现未知的GCC错误(严重)

我有一个基于ARM NEON Cortex-A8的处理器目标。 我通过使用NEON来优化我的代码。 但是当我编译我的代码时,我得到了这个奇怪的错误。 不知道如何解决这个问题。 我正在尝试使用主机上的Code Sourcery(PART2)编译以下代码(第1部分)。 我得到了这个奇怪的错误(PART3)。 我在这里做错了吗? 任何人都可以编译它,看看他们是否也得到相同的编译错误? 奇怪的是,在代码中,如果我注释掉else if(step_size == 4)代码的一部分,那么错误就会消失。 但是,遗憾的是我的优化并不完整,所以我必须拥有它。 起初我认为它是CodeSourcey编译器(在我的主机上)的问题,所以我直接在我的目标上编译程序(我的目标在Ubuntu上运行)。 我在那里使用了gcc,再一次,我得到了同样的错误,当我注释掉else if(step_size == 4)部分时,错误就消失了。 救命! 第1部分 #include #include”arm_neon.h” #define IMAGE_HEIGHT 480 #define IMAGE_WIDTH 640 float32_t integral_image[IMAGE_HEIGHT][IMAGE_WIDTH]; float32x4_t box_area_compute3(int, int , int , int , unsigned int , float); inline int min(int, int); int main() { box_area_compute3(1, 1, 4, […]