多核程序设计(最重要的)

多核程序设计(最重要的)
多核程序设计(最重要的)

一、多项选择

1.计算机的硬件工艺发展的顺序是:(A)

A.电子管数字计算机、晶体管数字计算机、集成电路数字计算机、大规模集成

电路数字计算机。

B.晶体管数字计算机、电子管数字计算机、集成电路数字计算机、大规模集成

电路数字计算机。

C.电子管数字计算机、集成电路数字计算机、大规模集成电路数字计算机、晶

体管数字计算机。

D.电子管数字计算机、集成电路数字计算机、晶体管数字计算机、大规模集成

电路数字计算机

2.下面关于Intel8086芯片与8088芯片的描述,不正确的是:(D)

A.8086是第一个16位的微处理器。

B.8088是第一个16位的微处理器。

C.8086每周期能传送或接受16位整数。

D.8088每周期能传送或接受16位整数。

3.针对内存的速度瓶颈,英特尔为80386设计了--------来解决这个速度瓶颈:(B)A.虚拟86.

B.高速缓存(Cache).

C.浮点运算单元。

D.多媒体扩展指令集。

4.对一个具体的问题做性能优化时,可以同时在这多个层次上考虑可能的优化手段,一般来说:(AB)

A.在越高的层次上进行优化,可能获得的效益越高。

B.在越高的层次上进行优化工作则相对越容易实现。

C.在越高的层次上进行优化,可能获得的效益越低。

D.在越低的层次上进行优化工作则相对越难于实现。

5.VTune性能分析器中的取样功能有哪几种方式?(AC)

A.基于时间取样

B.随机取样。

C.基于事件取样。

D.线性取样。

6.Intel调优助手能够给我们自动推荐代码改进方法,主要有以下哪些方面?(BCD)

A.算法自动改进。

B.处理器瓶颈以及改进。

C.取样向导增强。

D.超线程。

7.使用-O3编译选项所得的程序,执行效率比使用-O2编译选项所得的程序--:(D)

B.低

C.一样

D.不一定

8.对于函数调用的边际效应,以下表述不正确的是:(B)

A.只要函数在调用的过程中改变了某些全局变量的值,我们就称函数调用中有边际效应。

B.存在边际效应的函数调用,其调用次数的不同会对整个程序的行为产生不同的影响。

C.为了避免函数调用的边际效应,就必须尽量避免使用全局变量,尽量使用局部变量。

D.编译器无法检测出函数调用中是否会产生边际效应,。。。移出循环体外。9.对于一个优化的编译器,以下表述不正确的是:(D)

A.编译器负责其中的寄存器分配的优化。

B.编译器负责其中的代码选择及有限重组的优化。

C.编译器进行一些局部范围内的优化。

D.优化的编译器能够改进算法的计算复杂度。

10.以下表述不正确的是:(D)

A.在传统的操作系统中,CPU调度和分派的基本单位是进程。

B.在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位。C.同一进程中线程的切换不会引起进程切换,从而避免了昂贵的系统调用。D.由一个进程中的线程切换到另一进程中的线程时,也不会引起进程切换。

11.以下表述不正确的是:(AC)

A.在引入线程的操作系统中,进程之间可以并发执行。

B.在引入线程的操作系统中,一个进程中的多个线程之间不可以并发执行。C.进程是拥有系统资源的一个独立单位,它可以拥有自己的资源。

D.线程是拥有系统资源的一个独立单位,它可以拥有自己的资源

12.以下表述不正确的是:(A)

A.用户级线程在用户层通过线程库来实现。对它的创建、撤销和切换要利用喜用的调用。

B.核心级线程由操作系统直接支持,即无论是在用户进程中的线程,还是系统进程中的线程,它们的创建、撤销和切换都由核心实现。

C.硬件线程就是线程在硬件执行资源上的表现形式。

D.用户级线程通过操作系统被作为核心级线程实现,再通过硬件相应的接口作为硬件线程来执行。

13.对于操作系统中的线程,以下表述不正确的是:(D)

A.操作系统中存在两种类型的线程,I/O阻塞线程和计算非阻塞线程。

B.IO阻塞线程主要用于有交互式的程序中,它在大多数时间内都在等待外部事

C.计算非阻塞线程在大多数时间内都是被调度函数调用到的,应该和处理器资源相匹配。

D.在处理IO阻塞线程的时候要依次地等待每个请求完成才继续处理下一个请求。

14.I/O阻塞线程----引起时间片切换开销,计算非阻塞线程----引起时间片切换的开销。(A)

A.不会,会。

B.会,不会。

C.都会。

D.都不会。

15.以下表述错误的是:(D)

A.OpenMP可以根据目标系统尽量使用最优数量的线程个数。

B.使用线程池可以避免为每个线程创建进程的开销。

C,线程池通常具有最大线程数限制,如果所有线程都繁忙,而额外的任务将放入队列中,直到有线程可用时才能够得到处理。

D.对于有优先级的线程,也可以使用线程池。

16.调用exit会使----进程终止;调用pthread_exit会使----进程终止。(B)A.整个,整个。

B.整个,调用。

C.调用,调用。

D.整个,整个。

17.如果多个线程同时执行函数的多个活动请求面不会相互干扰,那么这个函数是----,如果会相互干扰,那么这个函数是----。(A)

A.线程安全,非线程安全。

B.都是线程安全。

C,都是非线程安全。

D.非线程安全,线程安全。

18.用户级线程开销很----,内核线程开销很----。(C)

A.高,高。

B.高,低。

C.低,高。

D.低,低。

19.下列说法哪个是不正确的:(A)

A.应用程序可以在内存中找到内核对象的数据结构并直接改变它们的内容。B.内核对象都是通过调用函数来创建的。

C.内核对象的数据结构只能被内核程序访问。

D.Windows提供了一组函数,以使用定义的很好的方法来对内核对象的数据结

构进行操作。

20.下面哪个说法是正确的:(AB)

A.每个进程被初始化时,系统为它分配一个句柄表,用于保存该进程使用的内核对象信息。

B.相同的句柄值在不同的进程中可能标识不同的内核对象。

C.一个进程终止执行,它使用的内核对象也会被撤销。

D.内核对象是由进程拥有的。

21.下列说法哪个是不正确的:(C)

A.进程是线程的容器。

B.单个进程可以包含多个线程。

C.进程中不一定有线程。

D.Win32中有专门的创建进程的API:CreateProcess

22.OpenMP标准诞生于----年:(B)

A.1996

B.1997

C.1998

D.1999

23.以下表述不正确的是:(C)

A.OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。

B.OpenMP是一种能够被用于显示指导多线程、共享内存并行的应用程序编程接口(API)。

C.OpenMP的规范由ANSI发起,由一组主要的计算机硬件和软件厂商共同制定并认可。

D。OpenMP能够支持多种平台,包括大多数的类UNIX系统以及WindowsNT 系统。

24.在OpenMP的并行编程模型中,所有的处理器都连接到----的内存单元上,处理器在访问内存的时候使用的是----的内存地址空间。(D)

A.不同,相同。

B.不同,不同。

C.一个共享,不同。

D.一个共享,相同。

25.一个指令中的操作数地址,可以有----个。(ABCD)

A.0 B.1 C.2 D.3

二、简答

1.什么是并行计算机及其组成部分?

答:并行计算机是由一组处理单元组成的,这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。

组成部分:计算节点和节点间的通信与协作机制。

2.常见的调度策略有哪些?

答:先到先服务、最短作业调度、优先级调度、轮转法调度、多级队列调度。

3.Jackson优化定律是什么?

答:定律1:不要进行优化。

定律2:(仅针对专家)“除非你已经有了一个相当清晰可靠的非优化版本的实现,否则你不要试图对程序进行优化”。

4.一个好的测试数据集必须要具备的特点是什么?

答:(1)可衡量性(2)可重复性(3)静态的(4)有代表性

5.Amdahl定律的内容及含义是什么?

答:内容:对于整个程序优化后可能达到的加速比取决于程序可优化部分占程序执行时间总体的比例。

含义:即使对程序的可优化部分进行最高限度的性能改进,其对程序整体性能的改进仍然受限于可优化部分占程序总体的比例,而并不随所用优化手段的提高而提高。

6.多核处理器的性能调优方法受哪些因素限制?

答:(1)编译器永远不能改变程序在任何情况下的行为。

(2)编译器很难进行过时间、全局性的优化。

(3)编译时间必须尽可能的短。

7.体系结构无关的性能调优方法?

答:(1)消除循环不变量(2)减少过程调用(3)消除不必要的内存存取

8.Intel多核处理器微体系结构中对代码优化的支持都有哪些?

答:(1)取指和预解码的优化(2)指令队列的优化(3)解码的优化(4)执行核心的优化(5)内存的优化

9.用户级线程、核心线程和硬件线程的区别有哪些?

答:(1)用户级线程:在用户层通过线程库来实现。对它的创建、撤销和切换都不利用系统的调用。

(2)核心级线程:由操作系统直接支持,即无论是在用户进程中的线程,还是系统进程中的线程,它们的创建、撤销和切换都由核心实现。

(3)硬件线程:就是线程在硬件执行资源上的表现形式。

10.线程的生命周期有哪些?画图并对每个状态进行解释

答:

(1)就绪状态:该线程运行所需的一切条件都得到满足,已获得必要的资源和设备。但因处理器资源个数少于线程个数,所以该线程不能运行,而必须位于队列中等待分配处理器资源。

(2)运行状态:线程在处理器上处于运行的状态,该线程已获得必要的资源和设备,也获得了CPU,用户程序正在处理器行运行。

(3)等待状态:线程等待某种事件完成而暂时不能运行的状态,处于该状态的线程不能参加竞争处理器资源,此时,即使系统分配给该线程处理器也不能运行。

11.多线程程序设计中的常见问题及解决方法是什么?

答:常见问题:(1)由于线程共享同一进程的内存空间,多个线程可能需要同时访问同一个数据。

(2)对共享数据的并发访问可能导致数据的不一致性。

(3)如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。(4)竞争条件:若干进程并发地访问并且操纵共享数据的情况;共享数据的值取决于那个进程最后完成;防止竞争条件,并发进程必须被同步。

解决方法:依据实际情况,使用尽可能少的线程,这样可以最大限度地减少操作系统资源的使用,并可提高性能。

12.什么是优先级倒置?有哪些解决方法?

答:由于多个线程共享资源,在采用基于优先级调度策略时会出现较低优先级的线程先于高优先级线程执行的情况,即优先级倒置问题。

解决方法:(1)优先级继承(2)优先级顶置

13.非阻塞算法的特征是什么?

答:(1)无阻塞。只要没有竞争,线程就可以持续执行。

(2)无锁。系统整体持续执行。

(3)无等待。每个线程都可以持续执行,即使遇到竞争也是如此。只有极少数的非阻塞算法实现了这一点。

14.什么是伪共享?解决伪共享的方法有哪些?

答:伪共享:正在进行缓存代码行更新的时候,禁止访问该代码行中的元素,这种情况称为伪共享。

解决方法:(1)尽可能多地使用专用数据。

(2)利用编译器的优化功能来消除内存加载和存储。

15.进程由哪几部分组成?

答:(1)操作系统用来管理进程的内核对象。

(2)地址空间。

16.线程由哪几部分组成?

答:(1)线程的内核对象。

(2)线程堆栈。

17.创建想成函数的几点要求有哪些?

答:(1)主线程的进入点函数的名字必须是main,wmain,WinMain或wWinMain,而其他线程函数可以使用其他的任何名字。

(2)线程函数必须返回一个值,它将成为该线程的退出代码。

(3)线程函数应该尽可能使用函数参数和局部变量。

18.创建线程API原型并解释各个参数的含义。

HANDLE CreatThread(

PSECURITY_ATTRIBUTES psa,

DWORD cbStack,

PTHREAD_START_ROUTINE pfnStartAddr,

PVOID pvParam,

DWORD fdwCreate,

PDWORD fdwThreadID);

(1)psa。psa参数是指向SECURITY_ATTRIBUTES结构的指针。

(2)cbStack。cbStack参数用于设定线程可以将多少地址空间用于它自己的堆栈。

(3)pfdStartAddr和pvParam。pfdStartAddr参数用于指明想要新线程执行的线程函数的地址。pvParam既可以是一个数字值,也可以使指向包

含其他信息的一个数据结构的指针。

(4)fdwCreat。fdwCreat参数可以设定用于控制创建线程的其他标志。

(5)pdwThreadID。pdwThreadID必须是DWORD的一个有效地址,CreateThread使用这个地址来存放系统分配给新线程的ID。

19.线程池的作用是什么?

答:管理线程,减轻程序设计的负担,是Windows有机会协助进行线程的管理,从而是用于程序能够达到最佳的性能。

20.CPU核心数据共享与同步的通信机制是什么?

答:(1)总线共享Cache结构:每个CPU内核拥有共享的二级或三级Cache,

用于保存比较常用的数据,并通过连接核心的总线进行通信。

(2)基于片上互连的结构:每个CPU核心具有独立的处理单元和Cache,各个CPU核心通过交叉开关或片上网络等方式连接在一起。

21.并行和并发的区别?

答:如果某个系统支持两个或多个动作同时存在,那么这个系统就是一个并发系统。

如果某个系统支持两个或多个动作同时执行,那么这个系统就是一个并行系统。

22.并行计算必须具备的条件是什么/

答:(1)并行机(2)应用问题必须具有并行度(3)并行编程

23.并行计算技术的主要目的和目标是什么?

答:目的:(1)加速求解问题的速度(2)提高求解问题的规模

目标:在并行机上,解决具有重大挑战性计算任务的科学、工程及商业计算问题,满足不断增长的应用问题对速度和内存资源的需求。

24.并行计算的主要研究内容是什么?

答:(1)并行机的高性能特征抽取(2)并行计算设计与分析

(3)并行实现技术(4)并行应用

25.并行计算的时间有哪些?

答:(1)计算CPU时间(2)通信CPU时间

(3)同步开销时间(4)进程空闲时间

26.并行程序性能优化的方法有哪些?

答:(1)减少通信量、提高通信粒度

(2)全局通信尽量利用高效集合通信算法

(3)挖掘算法的并行度,减少CPU空闲等待

(4)负载平衡

(5)通信、计算的重叠

(6)通过引入重复计算来减少通信,即以计算换通信

27.顺序程序的特性有哪些?

答:(1)顺序性(2)封闭性(3)可再现性

28.并发程序的特性有哪些?

答:(1)交叉性(2)非封闭性(3)不可再现性

29.解决死锁的方法?

答:进程在运行前一次性地向系统申请它所需要的全部资源,系统能满足,则一次性地将所请求的全部资源分配给申请进程;若系统当前不能满足进程的全部资源请求,则就不分配资源,此进程暂不投入运行。

30.parallel与parallel for的区别是什么?

答:(1)并行区域采用了复制执行方式,将代码在所有的线程内各执行一次;(2)循环并行化则是采用工作非配执行方式,将循环需做的所有工作量,按一定的方式分配给各个执行线程,全部线程执行工作的总合等于原先串行执行所完成的工作量。

31.OpenMP任务调度方法及特点是什么?

答:(1)静态调度static:默认调度方式

(2)动态调度dynamic:动态地将迭代分配到各个线程

(3)guided调度:一种采用指导性的启发式自调度方法。开始时每个线程会分配到较大的迭代快,之后分配到的迭代快会逐渐递减。

32.OpenMP支持的线程同步机制都是什么?

答:(1)互斥锁的机制(2)事件通知机制

33影响OpenMP性能的因素有哪些?

答:(1)程序并行部分的比率(2)OpenMP本身的开销

(3)负载均衡(4)局部性(5)线程同步带来的开销

34.在MPICH2中的环境变量如何配置?

答:(1)选择“工具”——>“选项”,将MPICH2\include加入到头文件目录中(2)将MPICH2\lib加入到库文件目录中

(3)在项目属性的“配置属性”—>“常规”项中的“字符集”设置为“未设置”(4)在项目属性的“配置属性”——>“连接器”——>“输入”项中的“附加依赖项”加入mpi.lib

35.解释MPI.

答:消息传递接口(Message Passing Interface,简称MPI)是一种编程接口标准,而不是一种具体的编程语言。MPI标准定义了一组有可移植性的编程接口。典型MPI实现:MPICH、Intel MPI。MPI程序是基于消息传递的并行程序

36.MPI程序的四个函数的作用是什么?

答:(1)MPI_Init初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信装作准备。

(2)MPI_Finalize则是结束MPI执行环境。

(3)MPI_Comm_size用来标识各个MPI进程,其中参数MPI_Comm类型的通信域表示参与计算的MPI进程组,&rank,返回调用进程在comm中的标识号(4)MPI_Comm_size用来标识相应进程组中有多少个进程,其中参数MPI_Comm类型的通信域,标尺参与计算的MPI进程组;整形指针,返回相应进程组中的进程数。

37.MPI的两个核心函数是什么?

答:(1)int MPI_SEND(buf,count,datatype,dest,tag,comm)

(2)int MPI_RECV(buf,count,datatype,source,tag,comm.,status)

38.消息管理7要素是什么?

答:(1)发送或者接受缓冲区buf;(2)数据数量count(3)数据类型datatype (4)目标进程或者源进程destination/source;(5)消息标签tag

(6)通信域comm(7)消息状态status,只在接受的幻术中出现

39.MPI群集通信函数的作用有哪些?

答:(1)同步:在操作中,通信子comm中的所有进程相互同步,即它们相互等待,直到所有进程都执行了他们各自的MPI_Barrier函数,然后再各自接着开始执行后续的代码。

(2)广播:从一个root进程向组内所有其他的进程发送一条消息。

(3)聚集:聚集函数MPI_Gather是一个对一个的通信函数。

(4)播撒:MPI_Scatter是一对多的传递消息。

三.阅读程序

1.int gval=8;

void funcb(int *x,int *y,int z)

{

static int sv;

int u;

u=(*y)*gval;

*x=u+z;

}

void funcal(int *a,int n)

{

int i;

int cc=9;

#pragama omp parallel for

for(i=0;i

int temp=cc;

}funcb(&a[i],&temp,i);

}

结果:全局变量gval是共享的

循环控制变量i是线程私有的

cc在并行化语句之外声明,是共享的

temp是循环并行化语句内部的自动变量,是线程私有的

指针变量a、n是共享的

静态变量sv是共享的,在内存空间中只有一份,这种使用方式会引起数据冲突

变量u被并行线程调用,是线程私有的

参数x是私有的指针变量,*x指向的内存空间是共享的,实际参数是funca 的数组a

参数y是私有的指针变量,指向的*y也是私有的,实际内存空间是temp占用的空间

参数z是线程私有的

2.int val=8;

#paragma omp parallel for firstpruvate(val) lastprivate(val)

for(int i=0;i<2;i++){

printf(“i=%d val=%d\n”,i,val);

if(i==1)

val=10000;

printf(“i=%d val=%d\n”,i,val)

}

int count=0;

#paragma omp threadprivate(counter)

void inc_counter(){

counter++;

} 结果:counter=10000

3.int_tmain(int argc,TCHAR *argv[]){

#pragma omp parallel

for(int i=0;i<10000;i++)

inc_counter();

printf(“counter=%d\n”,counter);

} 结果:counter=30627

4.int global=0;

#pragma omp threadprivate(global)

int_tmain(int argc,TCHAR *argv[]){

global=1000;

#pargma omp parallel copyin(global){

printf(“global=%d\n”,blobal);

global=omp_get_thread_num();

}

printf(“global=%d\n”,global);

printf(“parallel again\n”);

#paragma omp parallel

printf(“global=%d\n”,global);

}

结果:global=1000

global=1000

global=1000

global=1000

global=0

parallel again

global=0

global=2

global=3

global=1

5.#include "stdafx.h"

#include "windows.h"

#include "omp.h"

int main(int argc , char * argv[]){

#pragma omp parallel sections{

#pragma omp section

printf("section 1 thread=%d\n",omp_get_thread_num());

#pragma omp section

printf("section 2 thread=%d\n",omp_get_thread_num());

#pragma omp section

printf("sectino 3 thread=%d\n",omp_get_thread_num());

}

return (0);

}

结果:section 1 thread=0

section 2 thread=1

section 3 thread=0

四.编程

1.基于事件解决线程同步

#include "stdafx.h"

#include

#include

#include

#include

using namespace std;

HANDLE evRead, evFinish;

void ReadThread(LPVOID param)

{

WaitForSingleObject (evRead ,INFINITE);

cout<<"Reading"<

SetEvent (evFinish);

}

void WriteThread(LPVOID param)

{

cout<<"Writing"<

SetEvent (evRead);

}

int main(int argc , char * argv[])

{

evRead = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;

evFinish = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;

_beginthread(ReadThread , 0 , NULL) ;

_beginthread(WriteThread , 0 , NULL) ;

WaitForSingleObject (evFinish,INFINITE) ;

cout<<"The Program is End"<

return 0 ;

}

2.并行编程求π

#include “stdafx.h”

#include “omp.h”

#define NUM_THREADS 2

static long num_step=100000;

double x,pi=0.0,step=1.0/(double)num_steps;

int main(int argc,_TCHAR* argv[]){

omp_set_num_threads(NUM_THREADS);

#pragma omp parallel for reduction(+:sum)private(x) for(long i=0:i

x=(i+0.5)*step;

sun+=4.0/(1.0+x*x);

}pi+=sum*step;

printf(“Pi=%f\n”,pi);

}

燕山大学多核程序设计实验报告

实验一Windows多线程编程 一、实验目的与要求 了解windows多线程编程机制 掌握线程同步的方法 二、实验环境和软件 WindowsXP VC6.0 三、实验内容 创建线程: HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId ); 四、实验程序 #include"stdafx.h" #include #include #include #include usingnamespacestd; voidThreadFrunc1(PVOIDparam) {

while(1) { Sleep(1000); cout<<"ThisisThreadFrunc1"<

实验四-循环结构汇编语言程序的设计实验报告

循环结构汇编语言程序设计实验报告

实验四循环结构汇编语言程序设计 一、实验目的 1、学习循环结构的汇编语言程序的设计和调试。 2、学习通过直接对8086计算机的寄存器和存的直接访问,编写更高效简洁的汇编程序。 3、加深掌握计算机整体的工作过程。 3、加深对排序算法的理解。 二、实验任务 编写程序求出数组A中(20个元素)的最大值和最小值(数组没有排序)。 要求至少采用二种不同的排序算法来实现。( 快速排序,归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、选择排序、基数排序……) 三、实验容 为了更好地实现老师所布置的实验任务,我们根据情况选取以下两种方式实

验。 1、利用冒泡排序的方式求解数组A中元素的最大值最小值。设计流程图如 下所示: 2、利用选择排序的方式求得数组A中元素的序列。设计流程图如下所示:

四、实验环境 PC机: winXP/win7(32位)/win7(64位)+winxp 虚拟机 汇编工具:Masm.exe+Link.exe。 五、实验步骤 1)建立和生成的文件 (1)编写的源程序,源程序名为abc、扩展名为.asm (2)源程序经汇编程序Masm.exe汇编(翻译)后生成二进制目标程序,文件名为abc.obj (3)目标程序需要经Link.exe连接生成可执行程序,文件名为abc.exe 2)汇编环境 最基本的汇编环境只需要两个文件:Masm.exe和Link.exe。将这两个文件拷入到已经建好的文件夹(例如 huibian)中,并将文件夹huibian放在硬盘根

目录C :\>下 3)上机步骤 进入DOS窗口中执行。 4)调试程序 进入DEBUG后,调试程序 5)调试成功后重新汇编、连接并生成可执行代码 6)执行程序,并对运行结果截图。 利用冒泡排序求得数组A中元素的最大值最小值的实验结果如下图所示:(说明:输入数据为:13,0,59,900,587,1,657,234,34,48) 利用选择排序对数组A中元素排序得到的序列得实验结果如下图所示:(说明:输入数据为13,0,59,900,587,1,657,234,34,48)

多核编程与并行计算实验报告 (1)

(此文档为word格式,下载后您可任意编辑修改!) 多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日

实验一 // exa1.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFunc1(PVOID param) { while(1) { Sleep(1000); cout<<"This is ThreadFunc1"<

实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include using namespace std; DWORD WINAPI FunOne(LPVOID param){ while(true) { Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! "; } return 0; } int main(int argc, char* argv[]) { int input=0; HANDLE hand1=CreateThread (NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED,

循环结构程序设计(C语言实验报告)

仲恺农业工程学院实验报告纸 信息学院(院、系) 专业 班 C 语言程序设计 课 实验目的: (1)熟练掌握用三种循环语句实现循环的方法。 (2)掌握在程序设计中用循环方法实现的一些常用算法。 (3)进一步学习调试程序。 实验内容与总结: 编程练习 1、打印出所有“水仙花数”——教材P129-6.6 程序如下: #include void main() { int i,j,k,n; for(n=100;n<1000;n++) { i=n/100; j=(n-i*100)/10; k=n-i*100-j*10; if(n==i*i*i+j*j*j+k*k*k) printf("水仙花数为:%d\n",n); } } (1)程序编制要点: ①用for 语句实现循环; ②立方的表示; ③if 语句的表达。 (2)该题目涉及的知识点和难点: ①for 语句的输入与使用; ②if 语句的使用。 2、用迭代法求a x = 。求平方根的公式为:)(211n n n x a x x +=+ 程序如下:

#include #include void main () { float x1,x2=1,a; printf("请输入求平方跟的数a="); scanf("%f",&a); do { x1=x2; x2=(x1+a/x1)/2; } while (fabs(x2-x1)>1e-5); printf("x的平方根是:%f\n",x2); } (1)程序编制要点: ①用do…while语句实现循环; ②平方根公式的输入; ③前后两次求出的x的差的绝对值小于1E-5。 (2)该题目涉及的知识点和难点: ①scanf函数,求绝对值函数fabs; ②do…while语句的输入与使用。 3、猜数字:编程先由计算机“想”一个1到100之间的整数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则结束游戏。 程序如下: #include #include /*使用srand和rand函数*/ #include /*使用time函数*/ void main() { int magic,guess,count=0; srand(time(NULL)); magic = rand() % 100 + 1; /*magic得到一个1到100的随机数*/ printf("请输入一个1到100之间的数,你共有10次机会:\n"); do { scanf("%d",&guess); count++; if((guess<=0)||(guess>=100))

c语言实验报告4 循环结构程序设计

《C程序设计》课程实验报告 学院:班级:姓名:学号: 实验设备:计算机1台实验日期:2011年3月1日 实验项目名称循环结构程序设计 实验目的 掌握使用三种循环语句实现循环结构的方法。 实验要求:能用while~ do~while for 三种循环语句实现循环结构,编写简单的程序,掌握这三种循环语句。 实验内容(包括步骤):1.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半另一个,以后每天早晨都吃剩下的一半另一个,到第十天早晨再想吃时,就剩一个桃子。问第一天共摘了多少桃子。 要求:分别用三种语句编写程序。 2.编写程序验证下列结论:任何一个自然数n的立方都等于n个连续奇数之和。例如:13=1;23=3+5;33=7+9+11;43=13+15+17+19。 要求:程序对每个输入的自然数计算并输出相应的连续奇数,直到输入的自然数为0时止。 3.编写程序,求1-3+5-7+…-99+101的值。 4.编写程序,求e的值。e ≈ 1+1/1!+1/2!+1/3!+1/4!+…+1/n! (1)用for循环,计算前50项。 (2)用while循环,要求直至最后一项的值小于10-6。 5.编写程序,输出从公元1600年至2000年所有闰年的年号。每输出5个年号换一行。判断公元年是否为闰年的条件是:

(1)公元年数如能被4整除,而不能被100整除,则是闰年。 (2)公元年数如能被400整除也是闰年。 6.编写程序,打印以下图形: * *** ***** ******* ***** *** * 7.输入一行字符,统计输入的字符中字母‘a’出现的次数(包括大小写)。 8.我国1991年有11.6亿人口,要求根据人口平均年增长率,计算从1991年算起经过多少年后我国的人口增加到15亿。 9.有一个四位数F=BBAA,前二位数相同,后二位数相同,此数又是某个自然数T的平方,求此数。 10.分解一个正整数的所有质因数 调试与结果测试:部分程序出现错误经过调整后调试正常,达到题目要求的结果,运行正常。

C语言数组与循环结构程序设计实验报告

实验报告 课程名称程序设计基础 实验项目数组与循环结构程序设计(一) 实验仪器计算机 系别计算机学院 专业 班级/学号 学生姓名 实验日期 2014.12.4 成绩 指导教师

实验三 一、实验目的 (1)熟悉掌握用while语句、do…while语句和for语句实现循环的方法。 (2)掌握在程序设计中用循环的方法实现一些常用算法。 (3)进一步学习调试程序。 二、实验内容 (1)输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 在得到正确结果后,请修改程序使之能分别统计大小写字母、空格、数字和其他字符的个数。 (2)输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个水仙花数,因为153=13+53+33。 (3)猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第一天共摘多少个桃子。 在得到正确结果后,修改题目,改为猴子每天吃了前一天剩下的一半零两个。请修改程序并运行,检查结果是否正确。 三、实验课时 2课时 四、实验步骤(20分) (1).先分析题目,想一个能达成目标的算法,然后打开vc6.0开始打码,等到完成后先编译看是否有错误,若有则查看软件给出的提示再进行修改,直到成功再运行程序并输入数字检验,看是否正确,不正确则返回代码再修改直到结果正确,最后截图完成实验。 (2).分析题目初步确定算法,然后打开vc6.0开始打码,注意格式,防止犯错误,代码打好后F7查看是否正确,不正确则修改,正确则开始运行,验证输出是否正确,错误则返回修改,否则完成实验。 (3).分析题目初步确定算法,打开VC6.0,新建文件C++SF,输入代码,运行,

循环结构程序设计实验报告

嘉应学院计算机学院 实验报告 课程名称程序设计基础实验名称实验地点 指导老师实验时间提交时间 班级姓名座号 一、实验目的和要求 (1)熟悉掌握用while语句、do…while语句和for语句实现循环的方法。 (2)掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。 (3)进一步学习调试程序。 二、实验环境和方法 实验方法: (一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。 (二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。 (三)根据实验内容,编译程序。 实验环境:Windows xp Visual C++6.0 三、实验内容及过程描述 实验步骤: ①进入Visual C++ 6.0集成环境。 ②输入自己编好的程序。 ③检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错, 及时改正。 ④进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息”, 根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。 ⑤运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果 是否正确,应运行多次,分别检查在不同情况下结果是否正确。 实验内容:编译以下题目的程序并调试运行。 (1)输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。 编写程序如下: #include int main() { char c; int letters=0,space=0,digit=0,other=0; printf("请输入一行字符:\n"); while((c=getchar())!='\n')

多核程序设计

计算机的发展按照硬件工艺可以分为 第一代(1946~1958):电子管数字计算机。 第二代(1958~1964):晶体管数字计算机。 第三代(1964~1971):集成电路数字计算机。 第四代(1971年以后):大规模集成电路数字计算机。 现代计算机发展历程可以分为两个明显的发展时代: 串行计算时代 并行计算时代。 并行计算机是由一组处理单元组成的,这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。 并行计算机个最主要的组成部分: 计算节点 节点间的通信与协作机制 Flynn根据指令流和数据流的不同组织方式,把计算机系统的结构分为以下四类: 单指令流单数据流(SISD) 单指令流多数据流(SIMD) 多指令流单数据流(MISD) 多指令流多数据流(MIMD) 指令流(instruction stream) 指机器执行的指令序列 数据流(data stream) 指指令流调用的数据序列,包括输入数据和中间结果。 SISD 计算机是传统的顺序执行的计算机 在同一时刻只能执行一条指令(即只有一个控制流)、处理一个数据(即只有一个数据流)。 缺点: 单个处理器的处理能力有限 没有并行计算能力 在MIMD计算机中没有统一的控制部件。 在SIMD机中,各处理单元执行的是同一个程序, 而在MIMD机上,各处理器可以独立执行不同的程序。 MIMD结构比SIMD结构更加灵活。 SIMD计算机用于对不同数据的相同运算(向量和矩阵运算) 而MIMD计算机可以适应更多的并行算法 从系统结构的角度来分类,一般有以下几种: 1)对称多处理器(SMP) 2)分布式共享存储多处理机(DSM) 3)大规模并行处理机(MPP) 4)并行向量处理机(PVP) 5)集群计算机。

C语言循环结构程序设计实验报告

甘肃政法学院 本科生实验报告 ( 五) 姓名:赵明翔 学院:公安技术学院 专业:安全防范工程 班级: 2015级安全防范工程班 实验课程名称:程序设计 实验日期:2016年月日 开课时间:2015学年第二学期

(2)输出所有的水仙花数,所谓水仙花数是指一个3位数,其各位数字李方和等于该数本身。例如,153是水仙花数,因为153=12+53+33程序如下: #include int main() { int i,j,k,n; printf("paicissus numbers are"); for (n=100;n<1000;n++) { i=n/100; j=n/10-i*10; k=n%10; if(n==i*i*i+j*j*j+k*k*k) printf("%d",n); } printf("\n"); return 0; } 运行结果: (3)猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又

多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下了1个桃子了。求第一天共摘了多少桃子。 程序如下: #include int main() { int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2; x2=x1; day--; } printf("total=%d\n",x1); return 0; } 运行结果: (4)①用牛顿迭代法求方程0634223=-+-x x x 在1.5附近的根. #include #include int main() {double x1,x0,f,f1; x1=1.5; do {x0=x1; f=((2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x1=x0-f/f1;

多核编程与并行计算实验报告 (1)

多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日 实验一 // exa1.cpp : Defines the entry point for the console application.

// #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFunc1(PVOID param) { while(1) { Sleep(1000); cout<<"This is ThreadFunc1"<

实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include using namespace std; DWORD WINAPI FunOne(LPVOID param){ while(true) { Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! ";

多核程序设计概述

环/球/I T | 计算机教育 2007.7 | 39 ★英特尔多核课程园地★ 《多核程序设计》概述 浙江大学计算机学院 陈天洲 英特尔中国公司大学合作部 曹 捷 王靖淇/文 半导体技术的进步使单芯片多处理器成为现实并推动着多核计算技术的不断进步。浙江大学从2006年开设单独的多核课程,并联合国内五所重点高校设计编写了《多核程序设计》作为该课程的教材,对多核计算技术进行了全面深入的讲解,以期由此完善学生的知识结构。 1 多核计算技术的概述 随着新材料的应用和新技术的发展,VLSI 技术取得长足进步,在单个芯片上集成多个处理器核心构成多核处理器已经成为处理器技术的主流。按计算内核的对等与否,CMP 可分为同构多核和异构多核。计算内核相同,地位对等的称为同构多核。然而,一般认为处理器通用核的数目在超过16个后,再增加通用处理核的数目就难以带来更大的性能提升。于是出现了一些为特别任务专门定制的专用处理核,包括面向科学计算等的“领域专用核”、图形图像处理和数字信号处理(DSP)等“行业专用核”。这些专用核的体系结构利用特定应用的特征进行定制,从而达到定制应用的高性能和高效率。 从2005年出现的英特尔与AMD 的双核处理器、2006年推出的4核处理器到2007年2月英特尔公司展示的80核处理器,处理器中集成核的数目呈现迅速增多的趋势。除此之外,具有更多核和不同功能核的处理器也在研发,例如整合了1025个简单处理器的芯片Kilocore ,包括1024个8位处理器和1个Power PC 核。 伴随着多核处理器的发展尤其是处理器核数目的增加与处理器核功能的变化,在体系结构、软件、 功耗和安全性设计等方面,巨大的挑战也随之而来。处理器的发展使得原有面向单核或者多处理器的软件架构不适于在单芯片多处理器的硬件结构上充分利用多计算核心的能力,需要相应的软件层面的共同发展。为此,软件结构的变化尤其是针对多核硬件体系结构的程序设计成为有效发挥多核计算能力的重要方面。 为了适应技术的发展,为社会培养合格的计算机人才,在大学计算机教学中开设相应的多核计算课程势在必行。计算机方向课程的开设尤其是教材的设计,不仅要注意到满足完善学生知识结构,适应计算机技术迅速发展的情况,同时也需注意到社会对于多核计算技术方面人才的需求,通过合理的设计,满足知识更新与就业两方面的要求。 2 多核课程设计 多核计算技术的发展使得计算机教学发生了变化,这种变化主要来自于多核计算技术所带来的新的知识点。这些新的知识点主要包括:多核SOC 芯片技术;多核芯片与传统单核微处理器、SMP 的区别;多核下的各种硬件设计技术(Cache 与存储一致性、网络互连、IO 管理);并行体系与多核体系结构;典型多核芯片介绍;嵌入式多核芯片技术;多核平台结构与芯片组支持技术(包括固件技术);多核操作系统;多核系统软件对并行编程的支持;多线程编程对多核的支持;多核多线程编程技术(主要是关于Windows 与Linux 操作系统);OpenMP 对多核的支持;多核平台上的编译工具与编译优化技术;多核API 优化函数库;多核多线程程序的性能评测工具与方法。

实验3-循环结构程序设计

实验报告 课程名称C程序设计 实验项目循环结构程序设计 实验仪器PC机一台 学院_____信息管理学院_______ 专业信息管理与信息系统 班级/学号_信管1301/2013012054_ 学生姓名_____姜猛__________________ 实验日期_______________________ 成绩_______________________ 指导教师_______陈立南 _________

北京信息科技大学 信息管理学院 (课程上机)实验报告 实验课程名称: C程序设计专业:信息管理与信息系统班级: 信管1301 学号:2013012054 姓名:姜猛成绩: 实验名称循环结构程序设计实验地点小营校区计算中心实验时间 1.实验目的: 1)熟练掌握用while语句、do……while语句和for语句实现循环的方法 2)掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推) 3)进一步学习调试程序的方法 2.实验内容及要求: 1) 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 2) 求Sn=a+aa+aaa+aaaa+……(n个a)之值,其中a表示一个数字,n表示a 的位数,n由键盘录入。 3) 1!+2!+3!+4!+……+n! 4)输出所有“水仙花数”。“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身,如153=1^3 +5^3+3^3 。 5)一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3。编程找出1000以内的所有完数。 6)编写程序,完成课本P141的第10题。 7)猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子? 8)编写程序,完成课本P141的第16题。

多核程序设计考题(样本)

选择题:20% 1.下列不是多核处理器的是B A.INTEL酷睿2 E4500 B.AMD闪龙3000+ C.cell处理器 2.若对于一个给定的应用,用串行算法执行的时间为24秒,用并行算法执行的时间为32秒,则加速比为:A A.0.75 B.1.33 C.1 3.OpenMP是哪种并行编程环境的代表? C A.消息传递 B.数据并行 C.共享存储 4.针对“降低处理器二分之一的频率,会增加二分之一的功率消耗”的说法,下面的选项中哪个是正确的: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.lpParamenter B.lpStartSddress C.lpThreadAttributes 填空题:20% 1并行计算机的两个最主要的组成部分是计算节点和节点间的通信与协作机制 2.按计算内核的对等与否,CMP可分为同构多核和异构多核 3.目前比较主流的片上高效通信机制有两种,一种是基于总线共享的cache结构,一种是基于片上的互联结构. 4.进程具有两个明显的特征,一个是资源特征,另一个是执行特征. 5.线程有4个基本状态:就绪,运行,阻塞,终止 判断题10% 1.根据Amdahl定理,程序的加速比决定于串行部分的性能. . T 2.K-路组关联映射策略很容易产生cache颠簸. F 3.在忙等待条件下发生的饥饿,称为"死锁" F 4.在任何一个线程中调用exit将会结束整个进程. . T 5.墙上时间包括:计算CPU时间,通信CPU时间,同步开销时间和进程空闲时间. T 简答题:30% 1.简述什么是cache映射策略及当前的三种cache映射策略. Cache映射策略指的是内存块和cache线之间如何建立相互映射的关系.

《多核程序设计》概述

《多核程序设计》概述 陈天洲1 曹捷 王靖淇 (浙江大学计算机学院, 杭州 310027) 摘 要: 随着半导体技术的进步,多核芯片已经成为处理器技术的主流。浙江大学根据多核计算技术的发展趋势,以经典体系理论为基础,以培养动手实践能力为目标,开设了多核课程,并以此进行了教材设计,联合清华大学等高校编写了适合于《多核程序设计》,作为多核计算课程教学设计的一种探索。 关键词: 多核计算;课程设计;教材设计;实践 半导体技术的进步使单芯片多处理器成为现实并推动着多核计算技术的不断进步。浙江大学从2006年开设单独的多核课程,并联合国内五所重点高校设计编写了《多核程序设计》作为该课程的教材,对多核计算技术进行了全面深入的讲解,以期由此完善学生的知识结构。 1 多核计算技术的概述 随着新材料的应用和新技术的发展,VLSI技术取得长足进步,在单个芯片上集成多个处理器核心构成多核处理器[1][2][3]已经成为处理器技术的主流。按计算内核的对等与否,CMP可分为同构多核和异构多核。计算内核相同,地位对等的称为同构多核。然而,一般认为处理器通用核的数目在超过16个后,再增加通用处理核的数目就难以带来更大的性能提升。于是出现了一些为特别任务专门定制的专用处理核,包括面向科学计算等的“领域专用核”、图形图像处理和数字信号处理(DSP)等“行业专用核”[5, 6]。这些专用核的体系结构利用特定应用的特征进行定制,从而达到定制应用的高性能和高效率。 从2005年出现的英特尔与AMD的双核处理器[4]、2006年推出的4核处理器到2007年2月英特尔公司展示的80核处理器,处理器中集成核的数目呈现迅速增多的趋势。除此之外,具有更多核和不同功能核的处理器也在研发,例如整合了1025个简单处理器的芯片Kilocore [7],包括1024个8位处理器和1个Power PC核。 伴随着多核处理器的发展尤其是处理器核数目的增加与处理器核功能的变化,在体系结构、软件、功耗和安全性设计等方面,巨大的挑战也随之而来。处理器的发展使得原有面向单核或者多处理器的软件架构不适于在单芯片多处理器的硬件结构上充分利用多计算核心的能力,需要相应的软件层面的共同发展。为此,软件结构的变化尤其是针对多核硬件体系结构的程序设计成为有效发挥多核计算能力的重要方面。 为了适应技术的发展,为社会培养合格的计算机人才,在大学计算机教学中开设相应的多核计算课程势在必行。计算机方向课程的开设尤其是教材的设计,不仅要注意到满足完善学生知识结构,适应计算机技术迅速发展的情况,同时也需要到社会对于多核计算技术方面人才的需求,通过合理的设计,满足知识更新与就业两方面的要求。 2 多核课程设计 1收稿日期: 2007-05-16 作者简介: 陈天洲(1970-),男,浙江,博士,教授,主要研究方向:计算机系统结构、嵌入式系统。 曹捷,男,英特尔中国大学合作部 王靖淇,女,英特尔中国大学合作部

02多线程的那点儿事(之多核编程)

多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照维基百科的相关解释。 open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个核上面同时执行,从而可以达到快速执行代码的目的。比如说,我们可以编写一个简单的例子。 在编写open-mp程序之前,朋友们应该注意下面三点, (1) 使用vs2005或者以上的版本编写open-mp程序; (2) 编写程序的时候,选择【Property Pages】->【Configuration Properties】->【c/c++】->【language】->【OpenMp Support】,打开开关; (3) 添加#include 声明。 首先,我们编写简单的一个打印程序,看看结果。 [cpp]view plaincopy 1.#include 2. 3.void print() 4.{ 5.int i; 6.#pragma omp parallel for 7.for(i = 0; i < 100; i ++) 8. { 9. printf("%d\n", i); 10. } 11.} 上面这段代码好像也没有什么特别的地方,但是我们可以在printf设一个断点,看看函数调用堆栈, [cpp]view plaincopy 1.openmp.exe!print$omp$1() Line 14 C++ 2.vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0x19c bytes 3.vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0xe0 bytes 4.vcompd.dll!_InvokeThreadTeam@12() + 0x98 bytes 5.vcompd.dll!__vcomp_fork() + 0x1cd bytes 6.openmp.exe!print() Line 11 + 0xe bytes C++

多核架构及编程技术

《多核架构及编程技术》设计报告 基于OpenMP的二维方阵相乘及 基于IPP的函数DFT及反变换 学院:电子信息学院 专业:通信工程 学号: 2011301200237 姓名:叶子童 指导老师:谢银波 时间: 2013年6月

基于OpenMP的二维方阵相乘 姓名:叶子童专业:通信工程学号:2011301200237 指导教师:谢银波 [设计原理] 声明3个800阶的矩阵,用srand函数对A,B矩阵随机赋值,在主程序中用3个for循环来进行计算,用OpenMP实现循环并行化,用clock()函数统计运算时间并输出时间及C矩阵。 [主要功能] 计算2个随机生成的800阶二维矩阵相乘的结果,统计运算时间并输出结果矩阵。 [设计的主要内容] 实验代码为: #include"stdafx.h" #include #include #include"stdlib.h" #include #include int a[800][800], b[800][800], c[800][800];

int main() { int i, j, t, k; double duration; clock_t start, finish; for (int i=0;i<800;i++) for (int j=0;j<800;j++) a[i][j]=rand()%100; //随机产生-100的随机整数 for (int i=0;i<800;i++) for (int j=0;j<800;j++) b[i][j]=rand()%100; start=clock(); #pragma omp parallel shared(a,b,c) private(i,j,k) #pragma omp for schedule(dynamic) //循环动态分割成大小为chunk的块,动态分割给线程for(i=0;i<800;i++) { for(j=0;j<800;j++) { c[i][j]=0; for(k=0;k<800;k++) { c[i][j]+=a[i][k]*b[k][j]; } } } printf( "Time to do the calculate is "); finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%2.6f seconds\n", duration ); Sleep(2000); for(i = 0;i < 800;i++) { for(j = 0;j < 800;j++) { printf("%d ",c[i][j]); } printf("\n"); } return 0; } 输出的运算时间为3.483s。

燕山大学多核程序设计实验报告

实验一Windows多线程编程一、实验目的与要求 了解windows多线程编程机制 掌握线程同步的方法 二、实验环境和软件 Windows XP VC 6.0 三、实验内容 创建线程: HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 四、实验程序 #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFrunc1(PVOID param) {

while(1) { Sleep(1000); cout<<"This is ThreadFrunc1"<

并行计算与多核程序设计

第四章Windows多线程编程及 调优->web课件 返回 在Windows平台下可以通过Windows的线程库来实现多线程编程,可以利用Win32 API或MF C以及.Net Framework提供的接口来实现。实现方式的多样化给Windows编程带来了很大的灵活性,但也使得多线程编程变得复杂。对于多线程的程序我们可以使用Visual Studio调试工具进行调试,也可以使用多核芯片厂家的线程分析与调试工具进行调试及优化。 Windows线程库介绍 Win32 API是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。Win32 API提供了一系列处理线程的函数接口,来向应用程序提供多线程的功能。 MFC是微软基础函数类库(Microsoft Foundation Classes),由微软提供的,用类库的方式将Wi n32 API 进行封装, 以类的方式提供给开发者。在MFC类库中,提供了对多线程的支持。由于MF C是在Win32 API 基础之上进行封装的,其基本原理与Win32 API的基本实现原理很类似。MFC 对同步对象作了封装,因此对用户编程实现来说更加方便。 .NET Framework由两部分构成:公共语言运行库(Common Language Runtime ,CLR)和Fra mework类库(Framework Class Library ,FCL)。CLR包括自己的文件加载器、垃圾收集器、安全系统等。CRL提供了一个可靠而完善的多语言运行环境。CLR是一个软件引擎,用于加载应用程序、检查错误、进行安全许可认证、执行和清空内存。Framework类库提供了所有应用程序模型都要使用的一个面向对象的API集合。.NET 基础类库的System.Threading命名空间提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在System.Threading命名空间中。其中Thread类用于创建及管理线程,ThreadPool类用于管理线程池等,此外还提供线程间通讯等实际问题的机制。 使用win32线程API Win32 函数库中提供了操作多线程的函数,包括创建线程、管理线程、终止线程、线程同步等接口。 线程必须从一个指定的函数开始执行,该函数称为线程函数,具有如下原型: DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm); 线程创建 创建线程的函数如下:

实验四循环结构汇编语言程序设计实验报告

循环结构汇编语言程序设 计实验报告 实验四循环结构汇编语言程序设计 一、实验目的 1、学习循环结构的汇编语言程序的设计和调试。 2、学习通过直接对8086计算机的寄存器和内存的直接访问,编写更高效简洁的汇编程序。 3、加深掌握计算机整体的工作过程。 3、加深对排序算法的理解。 二、实验任务 编写程序求出数组A中(20个元素)的最大值和最小值(数组没有排序)。 要求至少采用二种不同的排序算法来实现。( 快速排序,归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、选择排序、基数排序……) 三、实验内容 为了更好地实现老师所布置的实验任务,我们根据情况选取以下两种方式实验。 1、利用冒泡排序的方式求解数组A中元素的最大值最小值。设计流程图如下所示:

2、利用选择排序的方式求得数组A中元素的序列。设计流程图如下所示: 四、实验环境 PC机: winXP/win7(32位)/win7(64位)+winxp 虚拟机 汇编工具:Masm.exe+Link.exe。 五、实验步骤 1)建立和生成的文件 (1)编写的源程序,源程序名为abc、扩展名为.asm (2)源程序经汇编程序Masm.exe汇编(翻译)后生成二进制目标程序,文件名为abc.obj (3)目标程序需要经Link.exe连接生成可执行程序,文件名为abc.exe 2)汇编环境 最基本的汇编环境只需要两个文件:Masm.exe和Link.exe。将这两个文件拷入到已经建好的文件夹(例如 huibian)中,并将文件夹huibian放在硬盘根目录C :\>下 3)上机步骤 进入DOS窗口中执行。 4)调试程序 进入DEBUG后,调试程序

相关文档
最新文档