搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
Intel Parallel Studio环境下的并行程序设计
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787302309765
  • 作      者:
    (美)Stephen Blair-Chappell, (美)Andrew Stokes著
  • 出 版 社 :
    清华大学出版社
  • 出版日期:
    2013
收藏
作者简介
  Stephen Blair-Chappell,在过去15年里一直在Intel软件和服务团队(SSG)工作。在Intel的这些时间里,Stephen是编译器小组的开发者,最近则作为技术咨询工程师帮助用户更好地充分利用Intel的软件工具。在进入Intel工作之前,Stephen曾经是德国的一个编译器和调试器公司CAD-UL在英国办事处的经营主任。在CAD-UL的期间Stephen主要负责英国的技术支持。其间他所经手的项目包括设计和规划一个图形化的链接器、面向编程者的保护模式下的编程开发和培训、对多个电信、汽车和嵌入式产业的技术支持。
  Stephen早期在马修巴顿技术学院(Matthew Boulton Technical College)作为技术人员学习电子学,然后在伯明翰城市大学(Birmingham City University,BCU)学习应用软件工程,最终在那里任教。在工作之余,Stephen还经常去当地伯明翰布尔林圣马丁教堂事奉,演奏手风琴、布道以及偶尔主领礼拜。
  
  Andrew Stokes,是英国伯明翰城市大学(Birmingham City University,BCU)软件与电子专业的退休教员,在教书之前,Andrew是研究与商业领域的软件开发者。最早在20世纪80年代的剑桥大学工程实验室开始软件开发,从事扫描电子显微镜的软件工作。这些软件开发工作延伸到商业领域,在商业领域里他从事有限元分析软件包的图形支持程序的工作。
  在BCU的期间,Andrew开发了许多仿真工具软件,包括人工神经网络仿真、CPU仿真、处理器设计、代码开发工具以及PROLOG专家系统。Andrew在退休之后继续保持对软件的兴趣,把游戏编程当成健身活动,例如3D象棋,其中并行编程是最重要的。在工作之余,Andrew是一个热情的园丁,尤其喜欢典型英国花园的艳丽色彩。
展开
内容介绍
  《Intel Parallel Studio环境下的并行程序设计》旨在帮助读者使用Intel Parallel Studio XE平台来编写可以利用多核CPU最新特性的程序。通过本书的学习,读者能够编写出快速、安全和并行的代码。全书分为3篇共16章,每章都给出了大量容易上手的练习,用于帮助你应用所讲解的内容,最后给出一个大型项目的案例分析,展示了如何使用Parallel Studio XE来实现并行化。
  《Intel Parallel Studio环境下的并行程序设计》对C、C++开发人员,以及从事代码并行化的学生或研究人员很有参考价值。
展开
精彩书摘

  第5章  编写安全的代码
  本章内容:
  * 执行静态安全分析;
  * 在项目的整个生命周期进行安全性问题的状态跟踪;
  * 了解哪些编程行为会使代码易于受到攻击。
  许多安全威胁来自于C或C++编程时引入的弱点。由于类型检查较弱以及可以编写直接访问内存和硬件的程序,很容易写出不安全的程序。大多数攻击可以归为两类:
  * 让程序崩溃或超载的攻击。
  * 通过插入外部代码而绑架代码执行的攻击。
  Intel编译器的静态安全分析(Static Security analysis)将排除许多代码弱点,这些弱点将在Intel的InspectorXE中显示。将有超过250个不同的错误可以被检查,可分为如下    类型:
  * 缓冲区溢出和越界。
  * 未初始化的变量和对象。
  * 内存泄漏。
  * 错误使用指针和动态分配内存。
  * 未检查输入的危险。
  * 数学溢出和除数为0。
  * 死代码或冗余代码。
  * 错误地使用字符串、内存和格式化的库例程。
  * 在程序不同的地方使用不一致的对象声明。
  * 错误地使用OpenMP或Cilk Plus。
  * 容易出错的C++和Fortran语言用法。
  本章讨论如何对代码使用Intel Parallel Studio XE进行静态安全性分析。静态安全检查的目的在于面对安全攻击时更加安全牢靠,同时对于发现编程错误也有帮助。
  5.1  一个简单的安全缺陷例子
  代码5-1包含了一个可以被攻击的安全错误。攻击者可以用一个未经检查的用户输入来产生缓冲区溢出。
  代码5-1  带有几个安全问题的程序
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  // user functions
  int NotePad(){printf("USER: here we launch notepad\n\n"); return 0;}
  int Exit(){ exit(0);}

  // system functions
  int Dir(){printf("SYSTEM: here we launch dir\n\n"); return 0;}
  int Delete(){printf("SYSTEM: here we launch Del\n\n"); return 0;}
  int ReturnToMain(){return -1;}

  int SystemMenu();
  int MainMenu();

  int (*user_table[])(void) = {NotePad, SystemMenu,Exit};
  int (*system_table[])(void) = {Dir, Delete, ReturnToMain};

  int SystemMenu()
  {
  char password[20];
  int id;
  int ret = 0;
  printf("System Menu\n");
  printf("Enter the Password before continuing!...\n");
  scanf("%s",password);
  if (strcmp(password, "PASSWORD") == 0)
  {
  while (ret != -1)
  {
  printf("Enter a number:\n");
  printf("1: dir\n");
  printf("2: delete everything\n");
  printf("3: back to main menu\n");
  scanf("%d",&id);
  ret = system_table[id-1]();
  }
  }
  else
  {
  printf("Invalid Password!\n");
  return 0;
  }
  return 0;
  }

  int MainMenu()
  {
  int id;
  printf("What would you like to do?\n");
  printf("Enter a number:\n");
  printf("1: run Notepad\n");
  printf("2: go to system menu\n");
  printf("3: quit\n");
  scanf("%d",&id);
  return user_table[id-1]();
  }

  int main ()
  {
  int ret = 0;
  while( ret != -1)
  ret = MainMenu();
  return ret;
  }
  code snippet Chapter5\5-1.c
  这个程序包含两个菜单:一个用户菜单和一个系统菜单。当程序刚启动时,MainMenu()函数给用户3个选择:
  What would you like to do?
  Enter a number:
  1: run Notepad
  2: go to system menu
  3: quit
  用户的输入由scanf()获取,然后将结果保存在id中。id的值(减1)用作数组user_table的索引,该数组是一个函数指针数组。
  选择1则调用Notepad函数,选择2则会让SystemMenu()函数显示系统菜单,选择3则通过Exit()函数退出程序。
  SystemMenu()函数工作原理与MainMenu()相似,使用system_table数组来跳转到Dir()、Delete()和ReturnToMain()函数。在系统菜单启动之前,用户被提示需要输入密码(PASSWORD)。如果密码错误,将显示一条消息然后将控制返回到MainMenu()函数,接着返回0给main()函数的while循环中。
  从用户菜单中选择2将显示一个需要密码的系统菜单。在正确输入密码之后将显示如下的菜单:
  System Menu
  Enter the password before continuing!...
  PASSWORD
  Enter a number:
  1: dir
  2: delete everything
  3: back to main menu

  5.2  了解静态安全分析
  预测攻击者将如何攻击一个程序是非常困难的。攻击者既狡猾又坏,将会利用代码中的任何弱点。编写一系列测试或者对应用程序进行调试都无法发现大量的弱点。使用上述方法时,最理想的情况下,将测试出到底如何执行,还有一些危险是无法测试的。
  静态安全分析和标准调试不一样,前者指分析代码而不执行。所有可能执行到的路径都将被分析,即使那些在测试下永远不会被执行的部分。
  对代码5-1执行静态安全分析将产生如下错误消息。这个问题可以用作安全性攻击的工具。
  * main.c(28): error #12329——请指定格式限定符(format specifier)以避免在scanf()第二个参数上出现缓冲区溢出。
  * main.c(38): error #12305——外部函数调用的返回值没有经过检验(文件:main.c  37行),该值用作system_table的索引。
  * main.c(59): error #12305——外部函数调用的返回值没有经过检验(文件:main.c  58行),该值用作user_table的索引。
  有人可以按如下方式进行攻击:
  * 使用无效的用户输入来越过系统菜单的密码——如果在用户菜单中输入一个大于3的数值,将会执行系统菜单中的函数。不需要输入密码!
  What would you like to do?
  Enter a number:
  1: run Notepad
  2: go to system menu
  3: quit
  5
  SYSTEM: here we would launch Del
  这是因为user_table数组和system_menu数组在内存中是相邻的。其中user_table有3项。使用索引号为4意味着函数指针将在内存中超过该数组的末尾处获得,从而读到system_table的第一项。
  * 使用无效的用户输入或系统输出引起程序崩溃或执行随意的代码——如果在菜单选择时输入一个非常大的数值,程序将开始执行不在这两个数组中的地址上的代码。如果你比较幸运,这些代码可能无害或者仅仅是崩溃。在最坏的情况下,可能开始执行一些有效的但是危险的代码。
  * 通过输入非常长的密码来让应用程序崩溃——passwd变量可以保存20个字符。下面的例子使用了长得多的密码。当调用scanf时,超出来的字符将会破坏堆栈,从而让程序崩溃。
  What would you like to do?
  Enter a number:
  1: run Notepad

  2: go to system menu
  3: quit
  2
  System Menu
  Enter the Password before continuing!...
  A_VERY_VERY_LONG_PASSWORD
  Invalid Password!
  ... (program crashes after this)
  5.2.1  虚警
  并不是所有静态安全分析报告的威胁都是真正的问题——这些称为虚警(false postives)。
  在下面代码中,静态安全分析器不够聪明,无法知道第一个if语句的不成功分支和第二个if语句的成功分支不可能同时被执行。

     ……

展开
目录
第1篇 并行简介
第1章 并行现状
1.1 并行时代的到来
1.1.1 功率密度的飙升
1.1.2 多核和众核计算的出现
1.2 六大挑战
1.2.1 遗留代码
1.2.2 工具
1.2.3 教育培训
1.2.4 众核计算的顾虑
1.2.5 可维护性
1.2.6 投入产出
1.3 并行与编程者
1.3.1 并行的类型
1.3.2 Intel的并行模型
1.3.3 选择正确的并行构造
1.3.4 并行编程错误
1.3.5 加速比和可扩展性
1.3.6 并行与实时系统
1.4 小结
第2章 Parallel Studio XE概览
2.1 Parallel Studio XE的优势
2.2 Parallel Studio XE组成
2.3 Intel Parallel Studio XE
2.4 Intel Parallel AdviSOr
2.4.1 Advisor工作流程
2.5 Intel Parallel Composer XE
2.5.1 Intel C/C++优化编译器
2.5.2 0penMP
2.5.3 Intel的线程构造块
2.5.4 Intel的集成性能原语
2.5.5 Intel的Parallel Debugger Extension
2.5.6 Intel Debugger
2.5.7 数学核心库MKL
2.6 VTune Amplifier XE
2.6.1 热点分析
2.6.2 并发性分析
2.6.3 锁和空闲分析
2.6.4 反汇编源码视图
2.7 Parallel Inspector XE
2.7.1 预定义分析类型
2.7.2 错误与警告
2.8 静态安全性分析
2.9 各种使用Parallel Studio XE的方法
2.10 小结
第3章 Parallel Studio XE快速上手
3.1 四步骤方法
3.2 例子1:使用CilkPlus
3.2.1 找一个合适的串行程序
3.2.2 运行串行程序
3.2.3 步骤1:分析串行程序
3.2.4 步骤2:用Cilk Plus实现并行性
3.2.5 步骤3:调试及错误检查
3.2.6 步骤4:对Cilk Plus程序调优
3.3 例子2:使用OpenMP
3.3.1 步骤1:分析串行程序
3.3.2 步骤2:使用OpenMP实现并行性
3.3.3 步骤3:调试与错误检查
3.3.4 步骤4:OpenMP程序的调优
3.4 小结

第2篇 Parallel Studio XE教程
第4章 生成优质的代码
4.1 引言
4.2 应用程序样例
4.3 代码优化的七步骤
4.3.1 使用编译器的报告
4.3.2 步骤1:不使用优化技术构建应用程序
4.3.3 步骤2:使用通用优化
4.3.4 步骤3:使用处理器相关的优化
4.3.5 步骤4:增加过程间优化
4.3.6 步骤5:性能测评指导的优化
4.3.7 步骤6:自动向量化的调优
4.4 更多关于自动向量化的内容
4.4.1 构建可以在多种CPU上运行的应用程序
4.4.2 其他插入向量化的方法
4.5 源代码
4.6 小结
第5章 编写安全的代码
5.1 一个简单的安全缺陷例子
5.2 了解静态安全分析
5.2.1 虚警
5.2.2 静态安全分析流程
5.2.3 实施一次静态安全分析
5.3 构建的明细
5.3.1 用注入方式创建构建明细文件
5.4 在QA环境中使用静态安全分析
5.4.1 回归测试
5.4.2 度量跟踪
5.5 源代码
5.6 小结
第6章 在何处并行化
6.1 性能测评的不同方法
6.2 示例应用程序
6.3 使用Intel编译器进行热点分析
6.3.1 性能测评步骤
6.3.2 一个具体的例子
6.3.3 性能测评引起的开销
6.4 使用auto-parallelizer进行热点分析
6.4.1 测评步骤
6.4.2 一个具体的例子
6.4.3 自动并行化编程指南
6.5 使用Amplifier XE进行热点分析
6.5.1 进行默认分析
……
第3篇 案例分析
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证