java调用clang编译的so_NDK clang编译器的一个bug

news/2024/11/28 10:50:50/

NDK clang编译器的一个bug

问题代码

float32_t Sum_float(float32_t *data, const int count)

{

float32x4_t res = vdupq_n_f32(0.0f);

for(int i = 0; i < (count & (~15)); i += 16)

{

#if 01

float32x4x4_t v0 = vld1q_f32_x4(data + i);

float32x4_t v00 = v0.val[0];

float32x4_t v01 = v0.val[1];

float32x4_t v02 = v0.val[2];

float32x4_t v03 = v0.val[3];

#else

float32x4_t v00 = vld1q_f32(data + i);

float32x4_t v01 = vld1q_f32(data + i + 4);

float32x4_t v02 = vld1q_f32(data + i + 8);

float32x4_t v03 = vld1q_f32(data + i + 12);

#endif

v00 = vaddq_f32(v00, v02);

v01 = vaddq_f32(v01, v03);

res = vaddq_f32(res, vaddq_f32(v00, v01));

}

float32x2_t res1 = vadd_f32(vget_low_f32(res), vget_high_f32(res));

float32_t v0[2];

vst1_f32(v0, res1);

v0[0] += v0[1];

for(int i = count & (~15); i < count; ++i){

v0[0] += data[i];

}

return v0[0];

}

编译测试

不同编译器版本结果:首先,对于所有的版本,如果使用#else块的代码,都是可以编译成功的,对于使用#if 01块的代码,结果如下:

armeabi-v7a with o1

armeabi=v7a with o0

arm64-v8a

r20c

clang++: error: clang frontend command failed due to signal (use -v to see invocation)

ok

ok

r19c

ok

ok

ok

r15c

error: use of undeclared identifier 'vld1q_f32_x4'

error: use of undeclared identifier 'vld1q_f32_x4'

ok

不仅仅vld1q_f32_x4,对于vld1_u8_x2;vst1q_f32_x4等类似指令都存在这样的问题。

性能对比

测试代码:

int main()

{

const size_t len = 1024*1024 * 16;

float32_t *data = new float32_t[len];

for(size_t i = 0; i < len; ++i) {

data[i] = std::rand() / 100.0;

}

clock_t t0 = std::clock();

float32_t sum = Sum_float(data, len);

printf("sum=%f , time cost=%f n", sum, 1000.0 * (double)(std::clock() - t0) / CLOCKS_PER_SEC);

return 0;

}

测试了使用三种NDK版本编译arm64-v8a测试,同时使用r19c编译了armeabi-v7a,分别使用#if和#else分之,发现耗时都是在3.55ms左右,无明显差别。

地址对齐

虽然使用r19c的版本编译armeabi-v7a成功,或者使用不优化的r20c也一样,但是执行时发生了crash。原因是执行vldN(q)_type_xN指令时,地址不对齐导致的crash。

而对于arm64-v8a版本,把所有传给vldN(q)_type_xN的地址打印出来,同样发现也有0x7350800001这样的地址,而且地址末位为0到E的都有,但是却没有报错。也即,对于该指令只有armeabi-v7a有地址对齐要求,而arm64-v8a却没有?

同时,常规的vldN(q)_type指令则没有地址对齐的要求,所以最好不要使用vldN(q)_type_xN。

在代码中因为地址对齐而导致的crash日志:

libc : Fatal signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0xf0900001 in tid 27659 (ClarityOpt), pid 27659 (ClarityOpt)

crash_dump32: obtaining output fd from tombstoned, type: kDebuggerdTombstone

crash_dump32: performing dump of process 27659 (target tid = 27659)

DEBUG : Process name is /data/local/tmp/ClarityOpt, not key_process

DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

DEBUG : Build fingerprint: 'OPPO/PCCM00/OP4A7A:10/QKQ1.191222.002/1584699103:user/release-keys'

DEBUG : Revision: '0'

DEBUG : ABI: 'arm'

DEBUG : Timestamp: 2020-05-09 15:15:16+0800

DEBUG : pid: 27659, tid: 27659, name: ClarityOpt >>> /data/local/tmp/ClarityOpt <<<

DEBUG : uid: 0

crash_dump32: type=1400 audit(0.0:27044): avc: denied { read } for name="ClarityOpt" dev="sda11" ino=30524 scontext=u:r:crash_dump:s0 tcontext=u:object_r:shell_data_file:s0 tclass=file permissive=1

crash_dump32: type=1400 audit(0.0:27045): avc: denied { open } for path="/data/local/tmp/ClarityOpt" dev="sda11" ino=30524 scontext=u:r:crash_dump:s0 tcontext=u:object_r:shell_data_file:s0 tclass=file permissive=1

crash_dump32: type=1400 audit(0.0:27046): avc: denied { getattr } for path="/data/local/tmp/ClarityOpt" dev="sda11" ino=30524 scontext=u:r:crash_dump:s0 tcontext=u:object_r:shell_data_file:s0 tclass=file permissive=1

crash_dump32: type=1400 audit(0.0:27047): avc: denied { map } for path="/data/local/tmp/ClarityOpt" dev="sda11" ino=30524 scontext=u:r:crash_dump:s0 tcontext=u:object_r:shell_data_file:s0 tclass=file permissive=1

DEBUG : signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0xf0900001

DEBUG : r0 00000043 r1 00000000 r2 a9a5ac6f r3 00000003

DEBUG : r4 f0900001 r5 ffcb0a00 r6 ffcb0a40 r7 ffcb0b60

DEBUG : r8 f0900007 r9 00000001 r10 f0900000 r11 f0900000

DEBUG : ip ffcb0500 sp ffcb09f0 lr 00000004 pc 021d265e

DEBUG :

DEBUG : backtrace:

DEBUG : #00 pc 0000365e /data/local/tmp/ClarityOpt (BuildId: fb1d8b990741386becb60ff1c8b10583efb05f70)

DEBUG : #01 pc 00004271 /data/local/tmp/ClarityOpt (BuildId: fb1d8b990741386becb60ff1c8b10583efb05f70)

DEBUG : #02 pc 00004c9f /data/local/tmp/ClarityOpt (BuildId: fb1d8b990741386becb60ff1c8b10583efb05f70)

DEBUG : #03 pc 00004dd3 /data/local/tmp/ClarityOpt (BuildId: fb1d8b990741386becb60ff1c8b10583efb05f70)

DEBUG : #04 pc 000513bb /apex/com.android.runtime/lib/bionic/libc.so (__libc_init+66) (BuildId: 8e41d0dce7911ae25a51deb63aa9720c)

DEBUG : #05 pc 00002a98 /data/local/tmp/ClarityOpt (BuildId: fb1d8b990741386becb60ff1c8b10583efb05f70)


http://www.ppmy.cn/news/241527.html

相关文章

vue cli怎么添加浏览器标签页图标

在build文件夹 1. 找到webpack.dev.conf.js&#xff0c;再找到HtmlWebpackPlugin&#xff0c;添加favicon:‘favicon.ico路径’ new HtmlWebpackPlugin({filename: index.html,template: index.html,favicon:./nationalEmblem.png, //这里设置图标路径inject: true}) 2. 然后…

android 堆栈 分析,Android JNI堆栈分析工具简介

8种机械键盘轴体对比 本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f; | 导语 从事Android开发的同事如果在碰到JNI的bug一般都是比较头疼的&#xff0c;因为JNI出错的日志信息比较少&#xff0c;不像Java层的堆栈那样&#xff0c;可…

Java集成openCV实现图片背景切换

下载openCV 官网地址&#xff1a;Releases - OpenCV 下载地址&#xff1a;Download OpenCV from SourceForge.net 这里我用的opencv440的windows版本 下载完成后点击exe进行安装&#xff0c;安装完成后会生成opencv文件夹&#xff0c;里面有各个环境文件 boot 示例 1.在ope…

android 设备 root,Root Android 设备

android手机root过程 设备Root难易度排名 个人理解。手机root的困难度排名&#xff1a; 华为系列 小米系列 oppo以及一加等 谷歌的nexsus 6p以及pixel等。 实际测试华为mate8,root完成之后&#xff0c;发现内核的一个debug参数设置为0&#xff0c;不能切换到su root。导致无法使…

Unity资源加载闪退问题深度分析

游戏线上测试总是有一些很奇怪的crash信息上报&#xff0c;闪退点是Unity引擎C层的方法GameObject::GetSupportedMessagesRecalculate。我们自己平时跑游戏&#xff0c;偶尔也会在场景切换的时候发生闪退。经过初步分析&#xff0c;确定是同一个crash。虽然收集到的闪退率不高&…

Android 购物车实现(思路+步骤+源码)

购物车 Android 购物车 购物车前言正文一、准备数据源二、绘制界面布局三、配置项目四、渲染数据五、功能实现① 商品、店铺选中② 单选、多选、全选③ 价格控制④ 编辑商品⑤ 细节优化 六、源码 总结 前言 购物车作为电商APP来说&#xff0c;是必备的。并且很多公司面试初级An…

cocos creator个人笔记-切换场景闪退(龙骨问题)

项目场景&#xff1a; creator 2.2.2 场景加载报错&#xff1a; 安卓原生打包后 测试切换关卡场景时候 有的关卡卡死有的没问题 其他端无法重现 问题描述&#xff1a; 这里是引用2021-01-11 15:10:25.496 2335-2335/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** …

Android兼容之libc++_shared.so库冲突方案

提供解决libc_shared.so库冲突方案 背景 随着App功能增多&#xff0c;集成的so库也会增多&#xff0c;如果系统中多个so库都使用系统自动生成的libc_shared.so库&#xff0c;如果不兼容时&#xff0c;会导致某个服务调用时crash 说明 当存在不兼容问题时&#xff0c;app会在…