《多核程序设计(燕山大学)试卷及答案(共7页).doc》由会员分享,可在线阅读,更多相关《多核程序设计(燕山大学)试卷及答案(共7页).doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 科目多核程序设计班级姓名学号时间09年 月 燕山大学试卷 -密-封-线- 共 5页 第 1 页题号一二三四总分一、选择题(20分)1.下列不是多核处理器的是 ( B ) A. INTEL酷睿2 E4500 B. AMD闪龙3000+ C. . cell处理器2.若对于一个给定的应用,用串行算法执行的时间为24秒,用并行算法执行的时间为32秒,则加速比为: ( A )A.0.75 B.1.33 C.13.OpenMP是哪种并行编程环境的代表? ( C )A. 消息传递 B.数据并行 C.共享存储4.针对“降低处理器二分之一的频率,会增加二分之一的功率消耗”的说法,下面
2、的选项中哪个是正确的: ( B ) A、这个说法是正确的 B、这个说法是错误的 C、对于台式机和服务器, 这个说法是正确的,但对于笔记本电脑,这个说法是错误的5.下面是线程创建函数,其中线程函数定义参数是: ( A ) HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID IpParameter, DWORD dwCreationFlags, LPDWORD IpThreadId, );A.l
3、pParamenter B.lpStartSddress C.lpThreadAttributes二、填空题( 20分)1并行计算机的两个最主要的组成部分是 计算节点 和 节点间的通信与动作机制 2. 按计算内核的对等与否,CMP可分为 同构多核 和 异构多核多核3. 目前比较主流的片上高效通信机制有两种,一种是 基于总线的Cache结构 ,一种是 基于片上的互连结构 .4. 进程具有两个明显的特征,一个是 资源特征 ,另一个是 执行特征 .5. 线程有4个基本状态: 就绪、运行、阻塞、终止 三、简答题(45分)1. 简述什么是cache映射策略及当前的三种cache映射策略(5分). Cac
4、he映射策略指的是内存块和cache线之间如何建立相互映射的关系.三种映射策略:直接映射策略,K-路组关联映射策略,全关联映射策略2. 简述下列Windows多线程程序设计中常用函数的含义(10分)ResumeThread();被挂起线程的恢复运行TerminateThread();终止线程运行InitializeCriticalSection();初始化线程临界区CreateMutex();创建线程互斥量CreateEvent();创建线程事件3. 简述下列Linux多线程程序设计中常用函数的含义( 10分)pthread_create();创建线程pthread_join();线程阻塞(同
5、步)pthread_attr_init();线程属性初始化pthread_cancel();线程取消sem_getvalue();获得线程信号量值4. 写出Openmp多线程程序设计中常用指导语句的含义. (10分)#pragma omp parallel for循环并行化#pragma omp parallel for firstprivate(val) lastprivate(val)使一个全局文件作用域的变量在并行域内变成每个线程私有,线程结束后,私有变量变成公有变量。#pragma omp parallel sections并行区域编译指导语句#pragma omp critical(
6、name)线程临界区及其命名#pragma omp atomic原子操作。5. 常用的并行程序性能优化技术有哪些? (5分)减少通信量,提高通信粒度 全局通信尽量利用高效集合通信算法 挖掘算法的并行度,减少CPU空闲等待 负载平衡 通信,计算的重叠 通过引入重复计算来减少通信,即以计算换通信6. 简述多线程机制的优点. (5分)创建一个线程比创建一个进程的代价要小 线程的切换比进程间的切换代价小 充分利用多处理器 数据共享 快速响应特性 可以是程序更加模块化,减少程序逻辑四、编程题(15分)写出蒙特卡洛法求Pi值的多线程并行程序。#include#include#include#include
7、#include #include long cs=0; /总循环次数long count=0; /主线程有效次数long count_thread=0; /thread线程有效次数struct timeval start, finish; /定义开始结束时间double diffsec,diffusec;/thread线程计算量为总数的一半void thread(void)int i=0;double x,y;for(i=0;ics/2;i+)x=(long double)rand()/(long double)RAND_MAX;y=(long double)rand()/(long dou
8、ble)RAND_MAX;if(x*x+y*y)=1) count_thread+;/主线程计算量为总数的一半int main (void)printf(Please input the number:);scanf(%d,&cs);cs=cs*;pthread_t id;int ret;srand( (unsigned)time( NULL ) );ret=pthread_create(&id,NULL,(void *) thread,NULL); /创建thread线程gettimeofday(&start,NULL); /记录开始时间int i=0;double x,y;for(i=0;
9、ics/2;i+)x=(long double)rand()/(long double)RAND_MAX;y=(long double)rand()/(long double)RAND_MAX;if(x*x+y*y)=1)count+;pthread_join(id,NULL); /两线程同步count+=count_thread;gettimeofday(&finish,NULL); /记录结束时间/计算时间差diffsec=(double)finish.tv_sec-start.tv_sec;diffusec=(double)(finish.tv_usec-start.tv_usec)/(double);diffsec+=diffusec;/输出结果printf(Cost time=%f second n,diffsec); printf(roop times=%d n,cs);printf(effective times=%d n,count);printf(pi= %f n,4*(double)count/(double)cs);return(0);专心-专注-专业