嵌入式开发者社区

标题: c6748浮点计算需要调用什么头文件 [打印本页]

作者: 369821854    时间: 2014-10-14 08:59
标题: c6748浮点计算需要调用什么头文件
我程序里要用到sin,cos,sqrt,浮点型运算,调用了math.h和mathlib.h,觉得时间较长。就在while(1)中计算了aa=3.3*3.1,第一次计算要17个clock,之后越来越多,一次计算要100多clock,我是在线调试的,用仿真器是100v2。资料这么说的,不是只用一个时钟吗,求大神指教
[img]file:///C:/Users/LC/Documents/Tencent%20Files/369821854/Image/JLCNF2%7BF7X%7B[XTE%7DIX06B9O.jpg[/img]



作者: 希望缄默    时间: 2014-10-14 09:05
参考 math 例程

作者: 369821854    时间: 2014-10-14 09:11
请问2个浮点相乘,计算时间是多少时钟周期

作者: 369821854    时间: 2014-10-14 09:11
希望缄默 发表于 2014-10-14 09:05
参考 math 例程

请问2个浮点相乘,计算时间是多少时钟周期

作者: weibo1988821    时间: 2014-10-14 09:32
进行数据的运算,不只是做一个乘法这么简单,还要看你的数据放置在哪些存储器上,比如DDR的读写速度就可能很慢,内存的读写速度就很快。而且,测试的时候应该是多次测量才更接近真实值,在CCS下的clock计数是不太准确的,你可以测1000次求一下平均值。

作者: 369821854    时间: 2014-10-14 10:41
weibo1988821 发表于 2014-10-14 09:32
进行数据的运算,不只是做一个乘法这么简单,还要看你的数据放置在哪些存储器上,比如DDR的读写速度就可能 ...

我统计了好多次,同一个运算a=3.3*3.1,运算几次后就成了一次运算用100多clock,资料上说一个时钟就可以,时间差好多,用仿真器是直接存在ram中吧,以前在论坛看到的

作者: 369821854    时间: 2014-10-14 10:42
weibo1988821 发表于 2014-10-14 09:32
进行数据的运算,不只是做一个乘法这么简单,还要看你的数据放置在哪些存储器上,比如DDR的读写速度就可能 ...

我统计了好多次,同一个运算a=3.3*3.1,运算几次后就成了一次运算用100多clock,资料上说一个时钟就可以,时间差好多,用仿真器是直接存在ram中吧,以前在论坛看到的

作者: weibo1988821    时间: 2014-10-14 11:08
我的意思是连续一千次乘法,记一个总得时间,平均成每一次的时间。还有,你的数据放在哪里是由cmd文件决定的,跟仿真器没关系~

作者: weibo1988821    时间: 2014-10-14 11:08
我的意思是连续一千次乘法,记一个总得时间,平均成每一次的时间。还有,你的数据放在哪里是由cmd文件决定的,跟仿真器没关系~

作者: 火山    时间: 2014-10-21 12:29
可以尝试用一个IO 来测试 ,例如 做100次该乘法之前拉低 完了在拉高。愚见哈@@

作者: zss    时间: 2018-10-22 10:42
希望缄默 发表于 2014-10-14 09:05
参考 math 例程

你好,你说的math例程是 指的那个例程呢?我购买6748开发板时,里面带光盘里的资料好像不全,没发现math例程。麻烦告知一下,谢谢。
作者: 希望缄默    时间: 2019-5-21 15:01
zss 发表于 2018-10-22 10:42
你好,你说的math例程是 指的那个例程呢?我购买6748开发板时,里面带光盘里的资料好像不全,没发现math ...

/****************************************************************************/
/*                                                                          */
/*              数学函数库测试 基本运算                                     */
/*                                                                          */
/*              2014年09月03日                                              */
/*                                                                          */
/****************************************************************************/
// 注意:sp 后缀的函数是单精度浮点运算
//      dp 后缀的函数是双精度浮点运算
// 部分函数并没有默认被编译到库中
// Mathlib 跟 FastRTS 的主要区别是 Mathlib 是浮点运算对浮点 DSP 指令优化
//                                 FastRTS 是浮点运算对定点 DSP 指令优化

#include <stdio.h>                  // C 语言标准输入输出函数库
#include <math.h>                   // C 数学函数库
#include <mathf.h>                  // C 数学函数库 浮点

#include "mathlib.h"                // DSP 数学函数库

/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
// 软件断点
#define SW_BREAKPOINT     asm(" SWBP 0 ");

/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/

/****************************************************************************/
/*                                                                          */
/*              函数声明                                                    */
/*                                                                          */
/****************************************************************************/

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
        printf("\n");

        // 除法
        printf("除法 单精度 2/3 = %f / 3/2 = %f \n", divsp(2, 3), divsp(3, 2));
        printf("除法 双精度 2/3 = %f / 3/2 = %f \n", divsp(2, 3), divsp(3, 2));

        // 返回小于或者等于指定表达式的最大整数
        printf("返回小于或者等于指定表达式的最大整数 RTS 库 %f \n", floorf(1.5));

        // 返回大于或者等于指定表达式的最小整数
        printf("返回大于或者等于指定表达式的最小整数 RTS 库 %f \n", ceilf(1.5));

        // 绝对值
        printf("绝对值 RTS 库 1.5 %f / -1.5 %f \n", fabsf(1.5), fabsf(-1.5));

        // 余数
        printf("余数 RTS 库 4.5 %% 3 %f \n", fmodf(4.5, 3));

        // 幂
        printf("幂 单精度 2^3 = %f / 2^1.5 = %f \n", powsp(2, 3), powsp(2, 1.5));
        printf("幂 双精度 2^3 = %f / 2^1.5 = %f \n", powdp(2, 3), powdp(2, 1.5));
        printf("幂 RTS 库 2^3 = %f / 2^1.5 = %f \n", powf(2, 3), powf(2, 1.5));

        // 倒数
        printf("倒数 单精度 0.5 %f \n", recipsp(0.5));
        printf("倒数 双精度 0.5 %f \n", recipsp(0.5));

        // 开方
        printf("开方 单精度 3^2 + 4^2 %f \n", sqrtsp(3 * 3 + 4 *4));
        printf("开方 双精度 3^2 + 4^2 %f \n", sqrtdp(3 * 3 + 4 *4));
        printf("开方 RTS 库 3^2 + 4^2 %f \n", sqrtf(3 * 3 + 4 *4));

        // 开方 倒数
        printf("开方 倒数 单精度 3^2 + 4^2 %f \n", rsqrtsp(3 * 3 + 4 *4));
        printf("开方 倒数 双精度 3^2 + 4^2 %f \n", rsqrtdp(3 * 3 + 4 *4));

        // 对数
        printf("对数 以2为底 单精度 4 %f \n", log2sp(4));
        printf("对数 以2为底 双精度 4 %f \n", log2dp(4));
        printf("对数 以2为底 RTS 库 4 %f \n", log2f(4));

        printf("对数 以e为底 单精度 e^2 %f \n", logsp(2.71828 * 2.71828));
        printf("对数 以e为底 双精度 e^2 %f \n", logdp(2.71828 * 2.71828));

        printf("对数 以10为底 单精度 100 %f \n", log10sp(100));
        printf("对数 以10为底 双精度 100 %f \n", log10dp(100));
        printf("对数 以10为底 RTS 库 100 %f \n", log10f(100));

        // 指数
        printf("指数 以2为底 单精度 4 %f \n", exp2sp(4));
        printf("指数 以2为底 双精度 4 %f \n", exp2dp(4));
        printf("指数 以2为底 RTS 库 4 %f \n", exp2f(4));

        printf("指数 以e为底 单精度 4 %f \n", expsp(2));
        printf("指数 以e为底 双精度 4 %f \n", expdp(2));

        printf("指数 以10为底 单精度 4 %f \n", exp10sp(4));
        printf("指数 以10为底 双精度 4 %f \n", exp10dp(4));
        printf("指数 以10为底 RTS 库 4 %f \n", exp10f(4));

        // 三角函数 参数弧度
        // π = 6arcsin(1/2)
        printf("正弦 单精度 sin(π/6) %f \n", sinsp(6 * asin(0.5) / 6));
        printf("正弦 双精度 sin(π/6) %f \n", sindp(6 * asin(0.5) / 6));
        printf("正弦 RTS 库 sin(π/6) %f \n", sinf(6 * asin(0.5) / 6));

        printf("余弦 单精度 cos(π/3) %f \n", cossp(6 * asin(0.5) / 3));
        printf("余弦 双精度 cos(π/3) %f \n", cosdp(6 * asin(0.5) / 3));
        printf("余弦 RTS 库 cos(π/3) %f \n", cosf(6 * asin(0.5) / 3));

        printf("正切 RTS 库 tan(π/4) %f \n", tanf(6 * asin(0.5) / 4));

        // 双曲函数 参数弧度
        // π = 6arcsin(1/2)
        printf("双曲函数 单精度 恒等式 cosh(x)^2 - sinh(x)^2 = 1 %f \n", pow(coshf(6 * asin(0.5) / 6), 2) - pow(sinhf(6 * asin(0.5) / 6), 2));

        printf("注意:部分函数并没有默认被编译到数学函数库");

        // 断点
        SW_BREAKPOINT;
}





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4