预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共85页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第8讲多核平台编程技术目录 8.1多核技术概论 8.2为什么要学习多核程序设计 8.3并行计算基础 8.4Linux多线程编程 8.5OpenMP多线程编程及性能优化微处理器发展史并行计算机并行计算机的弗林分类并行计算机系统结构分类2005+ Dual-andMulti-coreCache片上多核处理器架构AMD与Intel双核架构的对比芯片组对多核的支持——固件芯片组对多核的支持——固件(续)芯片组对多核的支持——固件(续2)EFI对多核支持操作系统对多核处理器的支持方法8.2为什么要学习多核程序设计8.2.2提高计算能力的基本途径 器件:新工艺(超大规模集成电路) 新材料(生物计算机、光计算机) 系统结构的改进:主要是克服VonNeumann的瓶颈问题。 流水线计算机、向量计算机、多处理机、并行计算机、集群。 8.2.3现实状况 计算能力几乎提高了上万倍,但是,实际的并行计算能力提高只有几十倍。 原因:不能利用计算机的并行处理能力。也就是没有解决并行计算中的并行程序设计的问题。 其核心问题是并行算法 8.3并行计算基础多级存储体系结构多级存储体系结构(续)并行计算机访存模型并行计算机访存模型(续)并行计算机访存模型(续2)并行计算模型SIMD同步并行计算模型MIMD异步计算模型——PRAM模型MIMD异步计算模型——BSP模型MIMD异步计算模型——LogP,C3模型线程并行编程环境编程语言与编译器并行计算性能评测程序性能优化常用并行数值算法常用并行数值算法——行矩阵乘法常用并行数值算法——行矩阵乘法并行编译器并行编译器8.4Linux多线程编程#include<pthread.h> #include<stdio.h> #defineNUM_THREADS5 void*PrintHello(void*threadid) { printf("\n%d:HelloWorld!\n",threadid); pthread_exit(NULL); } intmain(intargc,char*argv[]) { pthread_tthreads[NUM_THREADS]; intrc,t; for(t=0;t<NUM_THREADS;t++){ printf("Creatingthread%d\n",t); rc=pthread_create(&threads[t],NULL,PrintHello,(void*)t); if(rc){ printf("ERROR;returncodefrompthread_create()is%d\n",rc); exit(-1); } } pthread_exit(NULL); }程序输出②管理线程参数的传递参数传递-举例1:传输一个int型数据到各个线程。输出参数传递-举例2不正确的传递intmain(intargc,char*argv[]) { pthread_tthreads[NUM_THREADS]; intrc,t; messages[0]="English:HelloWorld!"; messages[1]="French:Bonjour,lemonde!"; messages[2]="Spanish:Holaalmundo"; messages[3]="Klingon:NuqneH!"; messages[4]="German:GutenTag,Welt!"; messages[5]="Russian:Zdravstvytye,mir!"; messages[6]="Japan:Sekaiekonnichiwa!"; messages[7]="Latin:Orbis,tesaluto!"; for(t=0;t<NUM_THREADS;t++) { printf("Creatingthread%d\n",t); rc=pthread_create(&threads[t],NULL,PrintHello,(void*)&t); if(rc) { printf("ERROR;returncodefrompthread_create()is%d\n",rc); exit(-1); } } pthread_exit(NULL); }举例4线程的交互-合并与分离合并操作的注意点: 通知操作系统阻塞调用该函数的线程直到指定的线程退出。 若要等待多个线程,只需简单的合并所有线程即可。 两个线程不能去合并同一个线程。 当某线程已经被合并后,任何其它线程都不能对其进行合并操作。 在线程被创建的同时,其属性就说明了这个线程是否可合并。 如果可合并,才可以对该线程做合并操作。 如果是声明脱离的,则永远不能被合并。#include<pthread.h> #include<stdio.h> #i