首页 > 其他分享 >XJTU-ICS Lab 4: Optimization Lab 性能优化实验

XJTU-ICS Lab 4: Optimization Lab 性能优化实验

时间:2023-06-09 11:35:56浏览次数:55  
标签:XJTU double cache poly Optimization Lab base res

Part A: 性能测量

  首先别忘了预热 cache。先跑一遍 poly 函数,从而避免在测量时由于 cold cache 带来的 cache miss 而导致测量值偏大。然后跑若干次 poly 函数,分别测量运行时间并取平均值。

void measure_time(poly_func_t poly, const double a[], double x, long degree, double *time) {
    double res = 0;
    double *result = &res;
    poly(a, x, degree, result); // 预热 cache
    double sum = 0;
    for (int i = 1; i <= 10; ++i) {
        struct timespec st, ed;
        clock_gettime(CLOCK_MONOTONIC, &st);
        poly(a, x, degree, result);
        clock_gettime(CLOCK_MONOTONIC, &ed);
        sum += ed.tv_nsec - st.tv_nsec;
    }
    *time = sum / 10;
}

Part B: 代码优化

  循环展开即可。展开 8 层后,CPE 为 0.97 左右。

void poly_optim(const double a[], double x, long degree, double *result) {
    double res1 = 0, res2 = 0, res3 = 0, res4 = 0, res5 = 0, res6 = 0, res7 = 0, res8 = 0;
    double base = ((x * x) * (x * x)) * ((x * x) * (x * x));
    long i = degree;
    for (; i >= 8; i -= 8) {
        res1 = a[i]   + base * res1;
        res2 = a[i - 1] + base * res2;
        res3 = a[i - 2] + base * res3;
        res4 = a[i - 3] + base * res4;
        res5 = a[i - 4] + base * res5;
        res6 = a[i - 5] + base * res6;
        res7 = a[i - 6] + base * res7;
        res8 = a[i - 7] + base * res8;
    }
    double factor = 1, res = 0;
    while (i >= 0) {
        res = a[i] + x * res;
        factor *= x;
        i--;
    }
    *result = factor * (res8 + x * (res7 + x * (res6 + x * (res5 + x * (res4 + x * (res3 + x * (res2 + x * res1))))))) + res;
}

标签:XJTU,double,cache,poly,Optimization,Lab,base,res
From: https://www.cnblogs.com/TouhouSumi/p/17468705.html

相关文章

  • opennmmlab实战营二期-mmdetection代码课(七)
    opennmmlab实战营二期-mmdetection代码课(七)点我:视频简单总结下,大致分为:mmdet介绍环境配置数据准备和可视化自定义配置文件训练前可视化验证模型训练模型测试和推理可视化分析目标检测的未来趋势......
  • matlab使用分位数随机森林(QRF)回归树检测异常值|附代码数据
    全文链接:http://tecdat.cn/?p=22160 最近我们被客户要求撰写关于分位数随机森林(QRF)回归树的研究报告,包括一些图形和统计输出。这个例子展示了如何使用分位数随机林来检测异常值分位数随机林可以检测到与给定X的Y的条件分布有关的异常值。离群值是一些观测值,它的位置离数据集......
  • 使用matlab进行功率谱估计之-纠误:很多人喜欢用2/N来纠正fft的幅度值
    先附上matlab官方文档对于使用fft进行功率谱估计的代码:%创建一个含N(0,1)加性噪声的100Hz正弦波信号。采样频率为1kHz。信号长度为1000个采样。fs=1000;t=0:1/fs:1-1/fs;x=cos(2*pi*100*t)+randn(size(t));%使用fft获取周期图。信号是偶数长度的实数值信......
  • MATLAB匿名函数解析
    在MATLAB中,匿名函数也被称为内联函数。它是一种无需用户定义的短小的函数表达式,通常用于一次性的简单计算。创建一个匿名函数可以使用以下语法:function_handle=@(input_arguments)expression这里的function_handle是一个指向函数的句柄,input_arguments是一个输入参数列表,而......
  • 最新MATLAB R2020b超详细安装教程(附完整安装文件)
    摘要:本文详细介绍 MatlabR2020b 的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用。从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用。本文目录如首页:目录前言1.下载安装包(1)下载链接(2)解压文件2.正式安......
  • JAVA 线程池之Callable返回结果
    JAVA线程池之Callable返回结果原文:https://www.cnblogs.com/hapjin/p/7599189.html本文介绍如何向线程池提交任务,并获得任务的执行结果。然后模拟线程池中的线程在执行任务的过程中抛出异常时,该如何处理。一、执行具体任务的线程类要想获得线程的执行结果,需实现Callable接......
  • Google colab 更改Tensorflow深度学习框架版本
    Googlecolab默认导入的tensorflow版本是2.0想,想更改tensorflow版本为1.x则需要加入%tensorflow_version1.ximporttensorflowastftf.__version__之后要进行colab的重启,即可完成版本改装,由于colab没有terminal,所以只能这么修改。欢迎登陆官网(附https://tensorflow.google.cn/)......
  • m基于自适应修复算法的AODV-SAR路由协议matlab性能仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要AODV-SAR,Self-AdaptiveRepair定义1自修复节点:任意选取路径S→A→B→C→D为MANET中一条业务传输路径,其中节点S为该传输路径的源节点,节点D为该传输路径的目的节点。如果在某一时间,节点B和节点C之间的路径发生......
  • m基于自适应修复算法的AODV-SAR路由协议matlab性能仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要AODV-SAR,Self-AdaptiveRepair          定义1自修复节点:任意选取路径S→A→B→C→D为MANET中一条业务传输路径,其中节点S为该传输路径的源节点,节点D为该传输路径的目的节点。如果在某......
  • gitlab和github的区别
    github:支持新分支和主分支合并,快速部署,出现问题可以恢复上一版本,是开发人员选择CI\CD的并行集成,一般会选择第三方CI工具,如Jenkins,CircleCI,TranvisCIgitlab:看重安全性,用户在master创建分支,合并时就需要多次审查,集成了Devops流程,持续集成\持续交付。中小型项目可以选择免费版。......