(CSAPP第三版系列)导航篇传送门

5.14编写5.13的6*1循环展开版本

代码如下:

/* Inner product. Accumulate in temporary */
void inner4(vec_ptr u,vec_ptr v,data_t *dest)
{long i;long length = vec_length(u);long limit = length - 5;data_t *udata = get_vec_start(u);data_t *vdata = get_vec_start(v);data_t sum = (data_t)0;for(i = 0;i < limit;i = i + 6){sum = sum + udata[i] * vdata[i];sum = sum + udata[i+1] * vdata[i+1];sum = sum + udata[i+2] * vdata[i+2];sum = sum + udata[i+3] * vdata[i+3];sum = sum + udata[i+4] * vdata[i+4];sum = sum + udata[i+5] * vdata[i+5];}for(;i < length;i++){sum = sum + udata[i] * vdata[i];}*dest = sum;
}

A.  原因:6*1循环展开标量版本的内积过程的关键路径仍然是n个加法操作,而在Haswell架构上整数加法的延迟为1个周期,所以这种方式编写程序的CPE不可能小于1.00。

B.  原因:在Hawell架构上浮点数加法操作的延迟为3个周期,而在使用6*1循环展开之前程序的CPE已经达到了3.01,所以即使使用6*1循环展开也是不可能突破这个下界的。


5.16 编写5.13的6*1a循环展开版本

代码如下:

/* Inner product. Accumulate in temporary */
void inner4(vec_ptr u,vec_ptr v,data_t *dest)
{long i;long length = vec_length(u);long limit = length - 5;data_t *udata = get_vec_start(u);data_t *vdata = get_vec_start(v);data_t sum = (data_t)0;for(i = 0;i < limit;i = i + 6){sum = sum + (udata[i] * vdata[i] + udata[i+1] * vdata[i+1] + udata[i+2] * vdata[i+2] + udata[i+3] * vdata[i+3] + udata[i+4] * vdata[i+4] + udata[i+5] * vdata[i+5]);;}for(;i < length;i++){sum = sum + udata[i] * vdata[i];}*dest = sum;
}


5.18优化多项式求值任务

若要使CPE接近于机器的吞吐量界限,可以使用10*10(浮点乘法延迟为5,容量为2)的并行累计方式编写程序。

代码如下:

/*使用直接求值方法*/
double poly(double a[],double x,long degree)
{long i;long limit = degree - 9;double result = a[0];double result_1 = 0;double result_2 = 0;double result_3 = 0;double result_4 = 0;double result_5 = 0;double result_6 = 0;double result_7 = 0;double result_8 = 0;double result_9 = 0;double xpwr = x;double xpwr_1 = x*x;double xpwr_2 = x*x*x;double xpwr_3 = x*x*x*x;double xpwr_4 = x*x*x*x*x;double xpwr_5 = x*x*x*x*x*x;double xpwr_6 = x*x*x*x*x*x*x;double xpwr_7 = x*x*x*x*x*x*x*x;double xpwr_8 = x*x*x*x*x*x*x*x*x;double xpwr_9 = x*x*x*x*x*x*x*x*x*x;for(i = 1;i <= limit;i++){result += a[i] * xpwr;result_1 += a[i+1] * xpwr_1;result_2 += a[i+2] * xpwr_2;result_3 += a[i+3] * xpwr_3;result_4 += a[i+4] * xpwr_4;result_5 += a[i+5] * xpwr_5;result_6 += a[i+6] * xpwr_6;result_7 += a[i+7] * xpwr_7;result_8 += a[i+8] * xpwr_8;result_9 += a[i+9] * xpwr_9;xpwr = xpwr * xpwr_9;xpwr_1 = xpwr_1 * xpwr_9;xpwr_2 = xpwr_2 * xpwr_9;xpwr_3 = xpwr_3 * xpwr_9;xpwr_4 = xpwr_4 * xpwr_9;xpwr_5 = xpwr_5 * xpwr_9;xpwr_6 = xpwr_6 * xpwr_9;xpwr_7 = xpwr_7 * xpwr_9;xpwr_8 = xpwr_8 * xpwr_9;xpwr_9 = xpwr_9 * xpwr_9;}for(;i <= degree;i++){result += a[i] * xpwr;xpwr = x * xpwr;}return (result + result_1 + result_2 + result_3 + result_4 + result_5 + result_6 + result_7 + result_8 + result_9);
}

CSAPP第五章家庭作业参考答案相关推荐

  1. CSAPP第7章家庭作业参考答案

    7.6 buf 有 m.o 外部 .data bufp0 有 swap.o 全局 .data bufp1 有 swap.o 局部 .bss incr 有 swap.o 局部 .text count 有 ...

  2. CSAPP第4章家庭作业参考答案

    4.45 不正确 push %rsp的指令会将rsp减8之前的old value压栈 应该是如下代码: movq REG, -8(%rsp) sub $8, %rsp 4.46 不正确 应该改为 ad ...

  3. CSAPP第二章家庭作业参考答案

    (CSAPP第三版系列)导航篇传送门 2.56 用不同的示例值运行show_bytes的代码. #include <stdio.h>typedef unsigned char *byte_ ...

  4. matlab胡良剑第五章,MATLAB习题参考答案(胡良剑,孙晓君)

    MATLAB习题参考答案 第一章 MATLAB入门 4.求近似解 解:>> x=-2:0.05:2;y=x.^4-2.^x 两个近似解:y1=f(-0.85)= -0.0328; y2=f ...

  5. 《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第五章课后习题参考答案

    第5章   总详细设计  课后习题参考答案 一.填空题 (1)结构化程序设计方法的要点是使用 顺序.选择和循环 结构,自顶向下.逐步求精地构造算法或程序 (2)为了产生结构化的流程图,应由三种基本控制 ...

  6. c语言第五次上机作业,大连理工c语言第五次上机作业参考答案(5页)-原创力文档...

    第五次上机作业:(请用指针实现) 数据移位 有n(n<=10)个整数,使前面各数顺序向后移m(m<=n)个位置,最后m个数变成最前面的m个数,如图所示.编写函数shift(a,n,m)实现 ...

  7. [第五章] 深入理解计算机系统第三版 家庭作业参考答案

    5.13 A. 画图: 关键路径为第三幅图加粗部分 B. 下界为浮点加法的延迟界限,CPE 为 3.00 C. 整数加法的延迟界限,CPE 为 1.00 D. 关键路径上只有浮点加法 5.14 voi ...

  8. [第三章] 深入理解计算机系统第三版 家庭作业参考答案

    人非圣贤孰能无过,欢迎大家提问与纠错 3.58 long decode2(long x, long y, long z) {y -= z;x *= y;return ((y << 63) ...

  9. [第六章] 深入理解计算机系统第三版 家庭作业参考答案

    6.22 磁道数 d 与 r - x * r 成正比 设 d = k(r - x * r) = kr(1 - x) 总容量 c = 2πxk(r^2)(1 - x) = 2πk(r^2)(x - x^ ...

最新文章

  1. matlan数据分析库函数
  2. Matrix工作室第六届纳新AI组考核题(A卷)
  3. 从大学生到职场人,一段深刻的思维认知升级补丁
  4. 读名老中医之路笔记(二)
  5. Java线程类核心方法
  6. 在搜索框自动输入文本_selenium自动化测试之常见的定位元素
  7. [vscode] c++ debugging
  8. 高效Redis Client多线程操作的并发吞吐设计
  9. 842. 将数组拆分成斐波那契序列
  10. Python学习之路day02——007字典的嵌套
  11. Java项目:企业固定资产管理系统(java+SpringBoot+VUE+maven+mysql)
  12. 机器学习笔记—模式识别与智能计算(一)模式识别概述
  13. 傻码农嘚瑟啥,HR才是国内公司真正的中流砥柱!
  14. 学习正则表达式 - 用 HTML 标记文本
  15. C#去除字符串中的换行符回车符空格符等
  16. 量子理论学习:概率幅
  17. 关于浏览器隐私/无痕模式下localStorage的判断
  18. 2010-2019,我,一个普通职场人的十年变迁
  19. 高精度地图lanelet2或opendrive转vectormap
  20. tableau连接不上oracle,Oracle

热门文章

  1. 线程池的几个重要参数
  2. 如何解决 使用matplotlib.finance获取雅虎财经网站股票数据 报错?
  3. 国内十大活跃报表 BI 产品深度点评
  4. 服务器上如何查看日志记录
  5. Matlab从入门到精通(一)
  6. JavaScript中的触发事件
  7. 量子计算为算法指数加速:Shor‘s algorithm
  8. bit Byte bps Bps
  9. 基于JAVA汽车租赁平台的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  10. CTF零基础--手把手带你如何下载调用dirsearch工具