math-neon基于NEON指令的数学库
这是一个开源的库,地址为https://code.google.com/p/math-neon/,根据项目介绍应该是利用neon指令实现的数学库:包括三角、对数、指数等基于浮点的运算实现,以及矩阵运算,因为是基于neon指令它必须在arm cortex-a架构(有neon指令支持)上才能运行。从项目介绍说因为gcc对于neon的支持不是很好(估计是指neon内在函数效率不如汇编),所以核心的运算代码都是使用内联汇编写成的。如果想编译并测试,可以下载作者写的Makefile(地址为http://gitorious.org/vjaquez-misc/math-neon/commit/14ba470caad37c33cf7245be69efc9a1366d8f99?format=patch)。
本人是想在WINCE下使用(平台为cortex-a8架构),因为代码使用了大量的内联汇编,如果想移植到WINCE平台需要重写汇编文件或利用WEC7编译器的内在函数功能(参见http://blog.csdn.net/alien75/article/details/8740641),两者均有很大的工作量,此时想到了久未使用的mingw32ce这个toolchain工具(参见http://blog.csdn.net/alien75/article/details/6998223),因为仅仅是编译出PE架构的静态库,此工具完全能满足需要,只是要修改一下Makefile才能进行正常编译。
原Makefile内容如下
- CFLAGS := -O2 -ggdb -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon -ansi -std=gnu99 -pedantic
- WARNINGS := -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes
- ASSEMBLER := -Wa,-mimplicit-it=thumb
- override CFLAGS += $(WARNINGS) $(ASSEMBLER)
- LIBS := -lm
- all: math_debug
- libmathneon.a: math_acosf.o math_ldexpf.o math_powf.o math_sqrtfv.o \
- math_asinf.o math_expf.o math_log10f.o math_runfast.o math_tanf.o \
- math_atan2f.o math_fabsf.o math_logf.o math_sincosf.o math_tanhf.o \
- math_atanf.o math_floorf.o math_mat2.o math_sinf.o math_vec2.o \
- math_ceilf.o math_fmodf.o math_mat3.o math_sinfv.o math_vec3.o \
- math_cosf.o math_frexpf.o math_mat4.o math_sinhf.o math_vec4.o \
- math_coshf.o math_invsqrtf.o math_modf.o math_sqrtf.o
- math_debug: math_debug.o libmathneon.a
- $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
- %.o:: %.c
- $(CC) $(CFLAGS) -o $@ -c $<
- %.a::
- $(AR) rcs $@ $^
- clean:
- $(RM) -v math_debug *.o *.a
修改后的内容
- CC=arm-mingw32ce-gcc
- AR=arm-mingw32ce-ar rc
- CFLAGS := -O2 -ggdb -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -ansi -std=gnu99 -pedantic -DNO_ERRNO_H -D_WIN32_WCE
- LDFLAGS := -L.
- WARNINGS := -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes
- ASSEMBLER := -Wa,-mimplicit-it=thumb
- override CFLAGS += $(WARNINGS) $(ASSEMBLER)
- #LIBS := -lm
- all: math_debug
- libmathneon.a: math_acosf.o math_ldexpf.o math_powf.o math_sqrtfv.o \
- math_asinf.o math_expf.o math_log10f.o math_runfast.o math_tanf.o \
- math_atan2f.o math_fabsf.o math_logf.o math_sincosf.o math_tanhf.o \
- math_atanf.o math_floorf.o math_mat2.o math_sinf.o math_vec2.o \
- math_ceilf.o math_fmodf.o math_mat3.o math_sinfv.o math_vec3.o \
- math_cosf.o math_frexpf.o math_mat4.o math_sinhf.o math_vec4.o \
- math_coshf.o math_invsqrtf.o math_modf.o math_sqrtf.o
- math_debug: math_debug.o libmathneon.a
- $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
- %.o:: %.c
- $(CC) $(CFLAGS) -o $@ -c $<
- %.a::
- $(AR) $@ $^
- clean:
- $(RM) -v math_debug *.o *.a
测试结果(系统函数、C语言优化函数和neon汇编函数比较结果见Rate后数字)
- RUNFAST: Enabled
- ------------------------------------------------------------------------------------------------------
- MATRIX FUNCTION TESTS
- ------------------------------------------------------------------------------------------------------
- matmul2_c =
- |2.66, -2.73|
- |-5.74, -15.83|
- matmul2_neon =
- |2.66, -2.73|
- |-5.74, -15.83|
- matmul2: c=112000 neon=65000 rate=1.72
- matvec2_c = |2.66, -5.74|
- matvec2_neon = |2.66, -5.74|
- matvec2: c=66000 neon=53000 rate=1.25
- matmul3_c =
- |-17.73, -8.39, -1.10|
- |8.30, -5.32, 23.03|
- |-5.67, -7.81, 9.07|
- matmul3_neon =
- |-17.73, -8.39, -1.10|
- |8.30, -5.32, 23.03|
- |-5.67, -7.81, 9.07|
- matmul3: c=394000 neon=120000 rate=3.28
- matvec3_c = |-17.73, 8.30, -5.67|
- matvec3_neon = |-17.73, 8.30, -5.67|
- matvec3: c=66000 neon=53000 rate=1.25
- matmul4_c =
- |-8.86, 8.70, -17.78, -7.64|
- |-13.15, 20.92, -10.97, -14.02|
- |17.37, -14.46, -13.16, 33.82|
- |15.42, -27.32, -5.66, -6.37|
- matmul4_neon =
- |-8.86, 8.70, -17.78, -7.64|
- |-13.15, 20.92, -10.97, -14.02|
- |17.37, -14.46, -13.16, 33.82|
- |15.42, -27.32, -5.66, -6.37|
- matmul4: c=991000 neon=141000 rate=7.03
- matvec4_c = |-8.86, -13.15, 17.37, 15.418112|
- matvec4_neon = |-8.86, -13.15, 17.37, 15.418112|
- matvec4: c=66000 neon=53000 rate=1.25
- dot2_c = 3.756326
- dot2_neon = 3.756326
- dot2: c=532000 neon=497000 rate=1.07
- normalize2_c = [-0.74, -0.68]
- normalize2_neon = [-0.74, -0.68]
- normalize2: c=691000 neon=313000 rate=2.21
- dot3_c = 3.698457
- dot3_neon = 3.698457
- dot3: c=572000 neon=514000 rate=1.11
- normalize3_c = [-0.74, -0.68, -0.01]
- normalize3_neon = [-0.74, -0.68, -0.01]
- normalize3: c=806000 neon=353000 rate=2.28
- cross3_c = [-4.69, 5.12, -1.46]
- cross3_neon = [-4.69, 5.12, -1.46]
- cross3: c=586000 neon=373000 rate=1.57
- dot4_c = -4.564567
- dot4_neon = -4.564566
- dot4: c=625000 neon=487000 rate=1.28
- normalize4_c = [-0.24, -0.22, -0.00, 0.95]
- normalize4_neon = [-0.24, -0.22, -0.00, 0.95]
- normalize4: c=924000 neon=343000 rate=2.69
- ------------------------------------------------------------------------------------------------------
- CMATH FUNCTION TESTS
- ------------------------------------------------------------------------------------------------------
- Function Range Number ABS Max Error REL Max Error RMS Error Time Rate
- ------------------------------------------------------------------------------------------------------
- sinf [-3.14, 3.14] 500000 0.00e+000 0.00e+000% 0.00e+000 880000 x1.00
- sinf_c [-3.14, 3.14] 500000 8.34e-007 1.00e+002% 4.09e-007 162000 x5.43
- sinf_neon [-3.14, 3.14] 500000 8.34e-007 1.00e+002% 4.09e-007 96000 x9.17
- cosf [-3.14, 3.14] 500000 0.00e+000 0.00e+000% 0.00e+000 906000 x1.00
- cosf_c [-3.14, 3.14] 500000 8.34e-007 6.74e-001% 4.16e-007 192000 x4.72
- cosf_neon [-3.14, 3.14] 500000 1.41e+000 6.64e+007% 1.00e+000 142000 x6.38
- tanf [-0.79, 0.79] 500000 0.00e+000 0.00e+000% 0.00e+000 1140000 x1.00
- tanf_c [-0.79, 0.79] 500000 2.98e-006 7.97e-004% 1.31e-006 200000 x5.70
- tanf_neon [-0.79, 0.79] 500000 1.91e-006 3.62e-004% 6.66e-007 126000 x9.05
- asinf [-1.00, 1.00] 500000 0.00e+000 0.00e+000% 0.00e+000 2732000 x1.00
- asinf_c [-1.00, 1.00] 500000 5.53e-005 1.06e-002% 1.69e-005 277000 x9.86
- asinf_neon [-1.00, 1.00] 500000 4.65e-005 8.87e-003% 1.#Re+000 151000 x18.09
- acosf [-1.00, 1.00] 500000 0.00e+000 0.00e+000% 0.00e+000 2670000 x1.00
- acosf_c [-1.00, 1.00] 500000 5.56e-005 6.46e-003% 1.69e-005 312000 x8.56
- acosf_neon [-1.00, 1.00] 500000 4.67e-005 6.35e-003% 1.#Re+000 171000 x15.61
- atanf [-1.00, 1.00] 500000 0.00e+000 0.00e+000% 0.00e+000 1021000 x1.00
- atanf_c [-1.00, 1.00] 500000 1.67e-004 2.12e-002% 7.40e-005 198000 x5.16
- atanf_neon [-1.00, 1.00] 500000 1.67e-004 2.12e-002% 7.40e-005 121000 x8.44
- sinhf [-3.14, 3.14] 500000 0.00e+000 0.00e+000% 0.00e+000 1509000 x1.00
- sinhf_c [-3.14, 3.14] 500000 1.91e-006 1.52e-001% 2.37e-007 280000 x5.39
- sinhf_neon [-3.14, 3.14] 500000 1.91e-006 1.52e-001% 1.90e-007 108000 x13.97
- coshf [-3.14, 3.14] 500000 0.00e+000 0.00e+000% 0.00e+000 1163000 x1.00
- coshf_c [-3.14, 3.14] 500000 1.91e-006 2.37e-005% 2.28e-007 283000 x4.11
- coshf_neon [-3.14, 3.14] 500000 1.91e-006 2.22e-005% 1.68e-007 108000 x10.77
- tanhf [-3.14, 3.14] 500000 0.00e+000 0.00e+000% 0.00e+000 1555000 x1.00
- tanhf_c [-3.14, 3.14] 500000 1.21e-005 2.48e-001% 5.48e-006 235000 x6.62
- tanhf_neon [-3.14, 3.14] 500000 2.38e-007 2.47e-001% 5.40e-008 119000 x13.07
- expf [0.00, 10.00] 500000 0.00e+000 0.00e+000% 0.00e+000 960000 x1.00
- expf_c [0.00, 10.00] 500000 9.77e-003 6.58e-005% 1.64e-003 132000 x7.27
- expf_neon [0.00, 10.00] 500000 9.77e-003 6.58e-005% 1.64e-003 88000 x10.91
- logf [1.00, 1000.00] 500000 0.00e+000 0.00e+000% 0.00e+000 1027000 x1.00
- logf_c [1.00, 1000.00] 500000 7.63e-006 1.03e-002% 1.07e-006 116000 x8.85
- logf_neon [1.00, 1000.00] 500000 7.63e-006 1.03e-002% 1.07e-006 82000 x12.52
- log10f [1.00, 1000.00] 500000 0.00e+000 0.00e+000% 0.00e+000 1202000 x1.00
- log10f_c [1.00, 1000.00] 500000 3.34e-006 6.68e-003% 4.84e-007 116000 x10.36
- log10f_neon [1.00, 1000.00] 500000 3.34e-006 6.68e-003% 4.84e-007 81000 x14.84
- floorf [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 4705000 x1.00
- floorf_c [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 819000 x5.74
- floorf_neon [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 671000 x7.01
- ceilf [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 5734000 x1.00
- ceilf_c [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 814000 x7.04
- ceilf_neon [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 696000 x8.24
- fabsf [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 2005000 x1.00
- fabsf_c [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 455000 x4.41
- fabsf_neon [1.00, 1000.00] 5000000 0.00e+000 0.00e+000% 0.00e+000 446000 x4.50
- sqrtf [1.00, 1000.00] 500000 0.00e+000 0.00e+000% 0.00e+000 3222000 x1.00
- sqrtf_c [1.00, 1000.00] 500000 2.33e-004 1.06e-003% 8.69e-005 139000 x23.18
- sqrtf_neon [1.00, 1000.00] 500000 7.63e-006 2.91e-005% 1.60e-006 85000 x37.91
- invsqrtf [1.00, 1000.00] 500000 0.00e+000 0.00e+000% 0.00e+000 106000 x1.00
- invsqrtf_c [1.00, 1000.00] 500000 4.35e-006 4.78e-004% 2.00e-007 94000 x1.13
- invsqrtf_neon [1.00, 1000.00] 500000 1.19e-007 2.12e-005% 4.81e-009 70000 x1.51
- atan2f [0.10, 10.00] 10000 0.00e+000 0.00e+000% 0.00e+000 2388000 x1.00
- atan2f_c [0.10, 10.00] 10000 1.73e-004 2.23e-002% 0.00e+000 657000 x3.63
- atan2f_neon [0.10, 10.00] 10000 1.67e-004 2.12e-002% 0.00e+000 278000 x8.59
- powf [1.00, 10.00] 10000 0.00e+000 0.00e+000% 0.00e+000 8316000 x1.00
- powf_c [1.00, 10.00] 10000 1.36e+005 5.88e-003% 0.00e+000 493000 x16.87
- powf_neon [1.00, 10.00] 10000 1.36e+005 5.88e-003% 0.00e+000 292000 x28.48
- fmodf [1.00, 10.00] 10000 0.00e+000 0.00e+000% 0.00e+000 1394000 x1.00
- fmodf_c [1.00, 10.00] 10000 9.99e+000 8.06e-002% 0.00e+000 341000 x4.09
- fmodf_neon [1.00, 10.00] 10000 9.97e+000 8.06e-002% 0.00e+000 238000 x5.86
math-neon基于NEON指令的数学库相关推荐
- math.js:灵活强大的JavaScript数学库
最近为期权开发一些基本技术指标,用到一些C++的数学库,刚好看到JavaScript的math.js库,这里对math.js做一下简单介绍. 一.什么是math.js math.js是一个广泛应用于J ...
- 密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)
密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码) 3. AES实验 3) (思考题)利用Sage构建AES的S盒和逆S盒 ...
- python怎么导入math库_Python math数学库的用法
对于基本的加.减.乘.除等运算,不用引入任何库就可以完成.但是如果要进行求正弦值.求平方根等运算,便需要使用数学库 math. math 库通过下面语句引入: import math 该库包含常用的常 ...
- 基于TIA博途利用SCL语言开发沿指令FC全局库来减少工作存储区的使用
基于TIA博途利用SCL语言开发沿指令FC全局库来减少工作存储区的使用 在程序中调用R_TRIG或F_TRIG时,系统会自动生成1个背景DB块,用于存放检测信号的边沿存储位,当程序中有较多信号需要检测 ...
- 开源项目推荐:我个人中意的Python/C++/.Net数学库(★精品收藏★)
Numpy和SciPy 大名鼎鼎的 NumPy python版本 https://github.com/numpy/numpy https://github.com/dpilger26/NumCpp ...
- python调用数学库_python 数学库
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我正在寻找一个3d数学库在python或python绑定. 它需要处理旋转,平移 ...
- 基于Vue结合Vant组件库的仿电影APP
Vue综合案例 Vue综合案例 一.项目概要 1.效果前瞻 2.开发流程 3.开发环境 二.初始化及必要知识点 1.初始化远程仓库 2.创建项目 3.路由规划 4.反向代理配置 5.网络请求封装 6. ...
- 《安富莱嵌入式周报》第306期:开源独轮车,Cortex-M85修订版r1发布,Terathon图形数学库,不断变革的IDE开发环境,各个厂家总动员
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- STM32 进阶教程 19 - IQmath数学库的使用
前言 STM32 M3 系列是不带浮点运算单元的,小数运算都是采用定点转浮点试式实现的,本节给大家介绍一个很好用的定点转浮点数学运算库,IQmath是德州仪器 (TI) 的一个高度优化的高精度数学函数 ...
最新文章
- CycliBarriar和CountdownLatch(计数器)
- VR直播云服务解决方案
- JAVA 连接MYSQL数据库操作
- 【Matlab】判断是否为空?是否为NaN?
- 联想服务器开机显示系统恢复选项,联想电脑win10系统开机时按哪个键进入一键还原模式...
- .NET应用迁移到.NET Core--调查案例
- Java 多线程 —— 深入理解 volatile 的原理以及应用
- python中使用什么来实现异常捕捉_Python异常原理及异常捕捉实现过程解析
- 挂载(mount)深入理解
- 基于visual Studio2013解决面试题之0707最小元素
- tomcat乱码的几种解决
- JAVA代码生成器源码-基于SSM架构
- 前方高能!公司来了一个low逼程序员
- Java培训要多久以后才能工作?
- 最详细G1垃圾回收器日志解读
- 人机智能交互技术(ROS)实践作业模版与说明
- 多核CPU 跟 进程/线程
- 笔记本电脑网络图标丢失解决流程
- 昔日金屋中的女人,谁都难免面对帝王决然的背影
- 和我一起读英文书吧-beyond feelings【1】
热门文章
- php.ini 配快捷方式,求高手解答!界面保存的网页快捷方式图标默认恢复.
- java项目集成mybatis_JAVA应用程序单独集成Mybatis使用Demo
- 皮一皮:如何将紫薯变成绿薯?
- 开源数据库表结构文档生成器
- LOL手游上线!同步专属限量游戏红包封面,还不快来拿?
- 每日一皮:终于明白女朋友挂在嘴边的“鸽子蛋”为什么那么贵了...
- MySQL中有哪些锁?
- Java 14 可能带来什么新特性?
- 电脑版java运行条件,Java Runtime Environment电脑版-Java Runtime Environment(Java运行环境)8.0.221 x64正式版-蜻蜓手游网...
- linux下运行js挖矿,利用 JavaScript 代码挖矿