多核编程与并行计算实验报告 (1)
并行计算的实验
实验一多线程计算π,性能分析1.1 实验内容多线程计算π,性能分析1.2 实验原理1.3实现方法编程语言:c++多线程:windows 多线程thread平台:windows 7600(32bit),Lenovo T400 Laptop ,IntelCore 2 Duo P8400 @ 2.26GHz集成开发环境:Visual Studio Team System 2008(32bit)1.4程序流程图NN i dx x Ni 15.0141402102⨯⎪⎪⎭⎫⎝⎛++≈+=∑⎰≤≤π1.5实验结果线程数NUM_THREAD=4N π Time-cost100 3.14160098692312 3ms1000 3.14159273692313 4ms10000 3.14159265442313 5ms100000 3.14159265359813 25ms1000000 3.14159265358990 82ms1.6性能分析精度随叠加次数N的增大而趋近于π的真实值,计算时间也随之增高;相同的叠加次数下,因为是双核处理器,线程数为2时计算性能最高。
理论性能提升有极限值,所以不会因为线程的增多而性能无限增强。
当线程数很大时,计算时间增加很快。
1.7总结展望第一次编写并行化的程序,对多线程编程有了初步的认识。
由于是在Visual Studio平台下编程,很多知识是从Lunix平台移植过来的,虽然表现形式有少许差别,但核心思想一致。
通过学习,对windows多线程编程有了一定的掌握。
实验二3PCF计算多线程实现2.1实验内容▪定义:–点集D、R。
–定义D中的点为a i∈D,R中的点为b i∈R。
–距离:r1、r2、r3、err▪求:–满足以下条件的三元组(空间中三角形)的数目•<a i, b m, b n>,|a i-b m|=r1±err且|a i-b n|=r2±err且|b m-b n|=r3±err2.2实验原理对于D中每一点a i,在R中找到与之距离为r1的点集R’,找到与之距离为r2的点集R’’。
多核编程与并行计算实验报告 (1)
多核编程与并行计算实验报告姓名:日期:2014年 4月20日实验一// exa1.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;void ThreadFunc1(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc1"<<endl;}}void ThreadFunc2(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc2"<<endl;}}int main(){int i=0;_beginthread(ThreadFunc1,0,NULL);_beginthread(ThreadFunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return 0;}实验二// exa2.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<iostream>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, NULL); HANDLE hand2=CreateThread (NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return 0;}实验三// exa3.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream>using namespace std;int globalvar = false;DWORD WINAPI ThreadFunc(LPVOID pParam){cout<<"ThreadFunc"<<endl;Sleep(200);globalvar = true;return 0;}int main(){HANDLE hthread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);if (!hthread){cout<<"Thread Create Error ! "<<endl;CloseHandle(hthread);}while (!globalvar)cout<<"Thread while"<<endl;cout<<"Thread exit"<<endl;return 0;}实验四:// exa4.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;HANDLE evRead, evFinish;void ReadThread(LPVOID param){WaitForSingleObject (evRead ,INFINITE);cout<<"Reading"<<endl;SetEvent (evFinish);}void WriteThread(LPVOID param){cout<<"Writing"<<endl;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"<<endl;return 0 ;}实验五// exa5.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;int total = 100 ;HANDLE evFin[2] ;CRITICAL_SECTION cs ;void WithdrawThread1(LPVOID param){EnterCriticalSection(&cs) ;if ( total-90 >= 0){total -= 90 ;cout<<"You withdraw 90"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;SetEvent (evFin[0]) ;}void WithdrawThread2(LPVOID param){EnterCriticalSection(&cs) ;if ( total-20 >= 0){total -= 20 ;cout<<"You withdraw 20"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;LeaveCriticalSection(&cs) ;SetEvent (evFin[1]) ;}int main(int argc , char * argv[]){evFin[0] = CreateEvent (NULL,FALSE,FALSE,NULL) ;evFin[1] = CreateEvent (NULL,FALSE,FALSE,NULL) ;InitializeCriticalSection(&cs) ;_beginthread(WithdrawThread1 , 0 , NULL) ;_beginthread(WithdrawThread2 , 0 , NULL) ;WaitForMultipleObjects(2 ,evFin ,TRUE ,INFINITE) ;DeleteCriticalSection(&cs) ;cout<<total<<endl;return 0 ;}实验六:// exa6.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;DWORD ThreadProc(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hMutex;cout << "ThreadProc: " << ThreadNumberTemp << " is running!" << endl;if ((hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { cout << "Open Mutex error!" << endl;}cout << "ThreadProc " << ThreadNumberTemp << " gets the mutex"<< endl;ReleaseMutex(hMutex);CloseHandle(hMutex);return 0;}int main(int argc, char* argv[]){int i;DWORD ID[THREAD_INSTANCE_NUMBER];HANDLE h[THREAD_INSTANCE_NUMBER];HANDLE hMutex;if ( (hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { if ((hMutex = CreateMutex(NULL, FALSE, "Mutex.Test")) == NULL ) { cout << "Create Mutex error!" << endl;return 0;}}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){h[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc,(void *)&ID[i],0,&(ID[i]));if (h[i] == NULL)cout << "CreateThread error" << ID[i] << endl;elsecout << "CreateThread: " << ID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,h,TRUE,INFINITE);cout << "Close the Mutex Handle! " << endl;CloseHandle(hMutex);return 0;}实验七// exa7.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3DWORD foo(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hSemaphore;cout << "foo: " << ThreadNumberTemp << " is running!" << endl;if ((hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Semaphore.Test")) == NULL) {cout << "Open Semaphore error!" << endl;}cout << "foo " << ThreadNumberTemp << " gets the semaphore"<< endl;ReleaseSemaphore(hSemaphore, 1, NULL);CloseHandle(hSemaphore);return 0;}int main(int argc, char* argv[]){int i;DWORD ThreadID[THREAD_INSTANCE_NUMBER];HANDLE hThread[THREAD_INSTANCE_NUMBER];HANDLE hSemaphore;if ((hSemaphore = CreateSemaphore(NULL,0,1, "Semaphore.Test")) == NULL ) { cout << "Create Semaphore error!" << endl;return 0;}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){hThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) foo,(void *)&ThreadID[i],0,&(ThreadID[i]));if (hThread[i] == NULL)cout << "CreateThread error" << ThreadID[i] << endl;elsecout << "CreateThread: " << ThreadID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,hThread,TRUE,INFINITE);cout << "Close the Semaphore Handle! " << endl;CloseHandle(hSemaphore);return 0;}实验八:// exa8.cpp : Defines the class behaviors for the application.//#include"stdafx.h"#include"exa8.h"#include"MainFrm.h"#include"exa8Doc.h"#include"exa8View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CExa8AppBEGIN_MESSAGE_MAP(CExa8App, CWinApp)//{{AFX_MSG_MAP(CExa8App)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CExa8App constructionCExa8App::CExa8App(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CExa8App objectCExa8App theApp;/////////////////////////////////////////////////////////////////////////////// CExa8App initializationBOOL CExa8App::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates// serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CExa8Doc),RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CExa8View));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)// No message handlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// App command to run the dialogvoid CExa8App::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}///////////////////////////////////////////////////////////////////////////// // CExa8App message handlers、实验九:using System;using System.Threading;class Test{static void Main(){ThreadStart threadDelegate = new ThreadStart(Work.DoWork);Thread newThread = new Thread(threadDelegate);newThread.Start();Work w = new Work();w.Data = 42;threadDelegate = new ThreadStart(w.DoMoreWork);newThread = new Thread(threadDelegate);newThread.Start();}}class Work{public static void DoWork(){Console.WriteLine("Static thread procedure.");}public int Data;public void DoMoreWork(){Console.WriteLine("Instance thread procedure. Data={0}", Data);}实验十:using System;using System.Threading;class Test{static int total = 100;public static void WithDraw1(){int n=90;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void WithDraw2()int n = 20;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void Main(){ThreadStart thread1 = new ThreadStart(WithDraw1);Thread newThread1 = new Thread(thread1);ThreadStart thread2 = new ThreadStart(WithDraw2);Thread newThread2 = new Thread(thread2);newThread1.Start();newThread2.Start();}}实验十一:// exa11.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<conio.h>#include<stdio.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;CRITICAL_SECTION cs;DWORD ThreadProc1(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc1: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc1 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}DWORD ThreadProc2(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc2: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc2 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}int main(int argc, char* argv[]){int i;DWORD ID1,ID2;HANDLE h1,h2;InitializeCriticalSection(&cs);printf("Create the critical section \n");h1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc1,(void *)&ID1,0,&(ID1));if (h1 == NULL)printf("CreateThread error %d \n",ID1);elseprintf("CreateThread %d \n",ID1);h2= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc2,(void *)&ID2,0,&(ID2));if (h2== NULL)printf("CreateThread error %d \n",ID2);elseprintf("CreateThread %d \n",ID2);WaitForSingleObject (h1,INFINITE);WaitForSingleObject (h2,INFINITE);printf("Delete the critical section \n");DeleteCriticalSection(&cs);getch();return 0;}。
并行程序实验报告
并行程序设计实验报告姓名:学号:一、实验目的通过本次试验,了解使用OpenMP编程的基本方法和MPI的编程方法,通过实践实现的基本程序,掌握基本的线程及进程级并行应用开发技术,能够分析并行性能瓶颈及相应优化方法。
二、实验环境Linux操作系统,mpi库,多核处理器三、实验设计与实现(一)MPI并行程序设计用MPI编写一个greeting程序,编号为0的进程接受其它各进程的“问候”,并在计算机屏幕上显示问候情况。
用MPI编写一个多进程求积分的程序,并通过积分的方法求π的值,结果与π的25位精确值比较。
(二)多线程程序设计用Pthreads或OpenMP编写通过积分的方法求π的程序。
把该程序与相应的MPI程序比较。
用Pthreads或OpenMP编写编写矩阵相乘的程序,观察矩阵增大以及线程个数增减时的情形。
四、实验环境安装(一)MPI环境安装1.安装kylin操作系统的虚拟机(用VirtualBox)2.安装增强功能,使之与windows主机能够文件共享。
3.拷贝mpich-3.0.4.tar.gz到/root/myworkspace/目录下,并解压(tar xzf mpich-3.0.4.tar.gz)4.下面开始安装mkdir /root/myworkspace/mpi./configure --prefix=/root/myworkspace/mpi --disable-f77 --disable-fcmakemake install5.配置环境变量打开/root/.bashrc文件,在文件的末尾加上两行:PATH=$PATH:/root/myworkspace/mpi/binexport PATH保存退出,然后执行命令source /root/.bashrc(二)openMP实验环境安装Visual Studio中修改:项目->属性->c/c++->语言,将“OpenMP支持”改成“是”:五、实验结果及分析(一)MPI并行程序设计实验一:问候发送与接收非零号进程将问候的信息发送给0号进程,0号进程依次接收其它进程发送过来的消息并将其输出。
C语言中的并行计算与多核处理器编程
C语言中的并行计算与多核处理器编程C语言是一门广泛应用于嵌入式系统、操作系统和科学计算等领域的高级编程语言。
它以其高效性和灵活性而闻名,而并行计算和多核处理器编程是当今计算机领域中的热门话题。
本文将详细介绍C语言中的并行计算和多核处理器编程,包括并行计算的概念、多核处理器的原理以及如何有效地在C语言中实现并行计算。
一、并行计算的概念并行计算是指多个操作同时进行,以提高计算速度和系统性能的计算方式。
与串行计算不同,串行计算是指按照顺序逐个执行操作。
并行计算的主要形式有数据并行和任务并行。
数据并行是指将大规模的数据集分解成多个小规模的数据集,然后分配给多个处理器同时处理。
任务并行是指将一个大任务分解成多个小任务,然后分配给多个处理器同时执行。
二、多核处理器的原理多核处理器是指在一个物理芯片上集成了多个处理器核心,每个处理器核心都具有独立的运算和存储能力。
多核处理器通过并行计算的方式,可以同时执行多个任务,提高系统的性能。
多核处理器采用了多级缓存、数据共享和并行调度等技术,以实现任务的分配和协调,从而更有效地利用处理器的资源。
三、C语言中的并行计算在C语言中实现并行计算需要依赖并行计算库和多线程编程技术。
常用的并行计算库有OpenMP和MPI。
OpenMP是一种基于共享内存的并行计算库,可以通过在代码中插入指令来实现并行化。
MPI是一种基于消息传递的并行计算库,用于在不同处理器之间进行通信和协调。
同时,C语言还提供了多线程编程技术,可以通过创建多个线程来实现并行计算。
四、多核处理器编程在多核处理器编程中,任务的划分和调度是关键。
可以通过任务划分和负载均衡来实现有效的并行计算。
任务划分是将一个大任务分解成多个小任务,然后分配给多个处理器核心执行。
负载均衡是保持各个处理器核心的工作量大致相同,避免出现任务执行时间过长或者某个处理器核心空闲的情况。
在C语言中,可以使用线程库如pthread来创建多个线程,并利用线程的特性进行任务划分和负载均衡。
并行计算实验报告一
并行计算实验报告一江苏科技大学计算机科学与工程学院实验报告评定成绩指导教师实验课程:并行计算宋英磊实验名称:Java多线程编程学号: 姓名: 班级: 完成日期:2014年04月22日1.1 实验目的(1) 掌握多线程编程的特点;(2) 了解线程的调度和执行过程;(3) 掌握资源共享访问的实现方法。
1.2 知识要点1.2.1线程的概念(1) 线程是程序中的一个执行流,多线程则指多个执行流;(2) 线程是比进程更小的执行单位,一个进程包括多个线程;(3) Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。
(4) Java代码可以为不同线程共享,数据也可以为不同线程共享; 1.2.2 线程的创建(1) 方式1:实现Runnable接口Thread类使用一个实现Runnable接口的实例对象作为其构造方法的参数,该对象提供了run方法,启动Thread将执行该run方法;(2) 方式2:继承Thread类重写Thread类的run方法;1.2.3 线程的调度(1) 线程的优先级, 取值范围1,10,在Thread类提供了3个常量,MIN_PRIORITY=1、MAX_ PRIORITY=10、NORM_PRIORITY=5;, 用setPriority()设置线程优先级,用getPriority()获取线程优先级; , 子线程继承父线程的优先级,主线程具有正常优先级。
(2) 线程的调度:采用抢占式调度策略,高优先级的线程优先执行,在Java 中,系统按照优先级的级别设置不同的等待队列。
1.2.4 线程的状态与生命周期说明:新创建的线程处于“新建状态”,必须通过执行start()方法,让其进入到“就绪状态”,处于就绪状态的线程才有机会得到调度执行。
线程在运行时也可能因资源等待或主动睡眠而放弃运行,进入“阻塞状态”,线程执行完毕,或主动执行stop方法将进入“终止状态”。
1.2.5 线程的同步--解决资源访问冲突问题(1) 对象的加锁所有被共享访问的数据及访问代码必须作为临界区,用synchronized加锁。
并行程序设计实验报告
并行程序设计实验报告实验报告:并行程序设计一、实验目的本实验旨在通过并行程序设计,提高程序的执行效率和性能,减少串行程序在处理大规模数据时出现的效率瓶颈。
二、实验原理1.任务划分:将大规模的任务划分成多个可并行执行的子任务。
2.任务分配:将各个子任务分配给不同的计算单元(如多线程、多进程、多核)进行处理。
3.任务合并:将各个子任务的计算结果进行合并,得到最终的结果。
三、实验内容本次实验主要涉及多线程编程和数据并行编程。
1.多线程编程多线程编程是指在一个单独的程序中同时运行多个线程,利用系统的多核资源来提高程序的执行效率。
多线程编程可以通过线程的创建、启动、运行和同步等操作来实现。
在本实验中,我们将使用C++编程语言,并利用其提供的多线程库来实现多线程编程。
具体步骤如下:(1)使用pthread库创建并启动多个线程。
(2)利用线程同步机制(如互斥锁、信号量等)保证线程的正确执行顺序和数据的正确性。
(3)通过编写并行程序,将大规模任务划分成多个子任务,并分配给不同的线程进行处理。
2.数据并行编程数据并行编程是指将大规模的数据划分成多个小块,并分配给多个计算单元(如GPU)进行并行处理。
每个计算单元都执行相同的计算操作,但操作的数据不同。
在本实验中,我们将使用CUDA平台进行数据并行编程。
(1)利用CUDA编程模型,将计算任务划分成多个线程块,并分配给不同的计算单元执行。
(2)通过编写并行程序,实现数据的划分和映射、任务的分配和协调。
四、实验结果经过多次实验,我们发现并行程序设计在处理大规模数据时能够显著提高程序的执行效率和性能。
相比于串行程序,多线程编程和数据并行编程分别提高了X%和Y%的执行速度。
同时,我们也发现在设计并行程序时,要考虑到数据的划分和映射、任务的分配和协调、线程的同步和通信等方面的问题。
这些问题对于程序的性能和正确性都有着重要的影响。
五、实验总结通过本次实验,我们了解到并行程序设计的基本原理和技术,以及它在优化程序性能和提高执行效率方面的重要作用。
并行计算实验一报告
并行计算实验一报告广东技术师范学院实验报告计算机科学与学院: 计算机科学学院专业: 班级: 成绩: 技术姓名: 学号: 组别: 组员: 实验地点: 工业中心203 实验日期: 指导教师签名: 预习情况操作情况考勤情况数据处理情况实验 (一) 项目名称: 建立并行计算平台一、实验目的在一个局域网中建立能够互相通信的两台计算机,为以后实验建立一个实验平台。
二、实验内容:1.1 系统要求安装MPICH for Microsoft Windows 对系统有如下要求:Windows NT4/2000/XP 的Professional 或Server 版(不支持Windows 95/98) 所有主机必须能够建立TCP/IP 连接MPICH 支持的编译器有:MS VC++ 6.x,MS VC++.NET,Compaq Visual Fortran 6.x,Intel Fortran,gcc ,以及g77 。
安装MPICH ,必须以管理员的身份登录。
1.2 安装以管理员的身份登录每台主机,在所有主机上建立一个同样的账户(当然也可以每个机器使用不同的用户名和账户,然后建立一个配置文件,使用命令行的方式运行程序),然后,运行下载的安装文件,将MPICH 安装到每台主机上。
打开“任务管理器”中的“进程”选项卡,查看是否有一个mpd.exe 的进程。
如果有的话说明安装成功。
以后每次启动系统,该进程将自动运行。
打开任务管理器如下:1.3 注册与配置安装好MPICH 之后还必须对每台计算机进行注册和配置才能使用。
其中注册必须每台计算机都要进行,配置只要在主控的计算机执行就行了。
注册的目的是,将先前在每台计算机上申请的账号与密码注册到MPICH 中去,这样MPICH 才能在网络环境中访问每台主机。
配置方法:运行“mpich\mpd\bin\MPIRegister.exe”首先会提示输入用户账号,然后会提示输入两边密码,之后会问你是否保持上面的设定。
多核计算与并行程序设计
多核计算与并行程序设计随着计算机技术的不断发展,多核处理器已经成为计算机系统中常见的组成部分。
多核处理器具有多个处理核心,每个核心都可以并行处理不同的指令。
并行计算技术的出现,提高了计算机系统的性能和效率。
在多核计算的背景下,同时也引发了并行程序设计的需求和挑战。
多核计算的出现,为我们提供了更大的计算资源。
通过将计算任务分配到不同的核心上,可以使程序并行执行,从而提高系统的运算速度。
传统的串行程序在多核计算系统中并不能充分利用计算资源,需要通过并行程序设计来进行优化。
并行程序设计强调任务的分解和分配。
首先,需要将程序分解成适合并行执行的子任务,然后将这些子任务分配到不同的处理核心上进行执行。
在分解和分配的过程中,要考虑任务间的依赖关系和互斥访问问题。
如果任务之间存在依赖关系,需要合理安排任务的执行顺序,保证依赖关系得到满足。
同时,如果多个任务需要同时访问共享的资源,如内存或文件,需要采取合适的同步机制,以避免数据竞争和冲突。
并行程序设计的核心是任务分解和任务调度。
任务分解是将程序分解成适合并行执行的子任务。
子任务之间应该具有较小的计算量和较少的通信开销,以确保并行执行的效率。
任务调度是将子任务分配到不同的处理核心上进行执行。
任务调度的策略可以根据需求和优化的目标灵活选择,如负载均衡、最小化通信开销、最小化执行时间等。
并行程序设计中还需要解决通信和同步的问题。
在多核计算系统中,不同核心之间需要进行数据共享和通信。
通信的实现可以通过内存共享或消息传递来实现。
在进行数据共享和通信时,需要涉及同步机制来保证数据的一致性和正确性。
常用的同步机制有锁和信号量等。
并行程序设计的实现需要考虑编程语言和工具的选择。
目前,有许多编程语言和工具可以用于并行程序设计,如C/C++、Java、OpenMP、MPI等。
适合的编程语言和工具可以简化并行程序设计的复杂性,提高开发效率。
在并行程序设计的过程中,还需要进行性能分析和调优。
多核处理器的并行算法研究及应用
多核处理器的并行算法研究及应用随着科技的飞速发展,计算机的处理速度也越来越快。
而作为现代计算机系统中的重要组成部分,处理器也在不断的发展和升级中。
多核处理器的问世,使得计算机系统的处理速度得到了大幅度提升。
对于程序开发者来说,利用多核处理器的优势,采用并行算法编写程序已经成为必备技能之一。
一、多核处理器的优势传统的单核处理器一次只能处理一个指令序列,处理速度有限。
而多核处理器中,集成了多个独立且完整的处理器,在同一时刻可以同时处理不同的指令,大幅度提升了处理速度。
多核处理器不仅可以更好地应对大数据量的计算任务,还能有效地节省处理器能量和减少系统响应时间。
多核处理器主要有两种设计方式,一种是对称多处理器(SMP),另一种是非对称多处理器(ASMP)。
对称多处理器的核心思想是:每个处理器的运行状态是相同的,都可以访问相同的内存空间。
非对称多处理器则是由多个不同类型的处理器组成的,每个处理器的运行状态都有所不同。
对于并行计算而言,对称多处理器更具有优势,应用范围也更广泛。
二、并行算法的概念并行算法,是指能够充分利用多核处理器的性能特点,通过同时执行多个计算任务,以最短的时间完成计算任务的一种算法。
在计算机科学领域中,许多经典算法都有着并行算法的实现方式。
比如排序算法、矩阵乘法等等。
并行算法的实现需要满足一定的条件:首先,任务之间应该具有独立性,任务之间不存在前后依赖关系。
其次,任务之间应该要有相同的计算量和运算方式。
最后,程序设计时需要避免不同处理器之间发生数据竞争现象,确保并行执行的正确性。
三、常见并行算法1、并行排序算法排序算法是计算机科学领域中的一类重要算法。
传统的排序算法主要是单线程执行的,无法满足大数据量的计算需求。
为了提高排序效率,研究人员开发出了各种性能优异、可扩展性强的并行排序算法。
其中,基于SMP多核处理器的算法应用范围最广,如快速排序算法、归并排序算法等。
2、并行矩阵乘法算法矩阵乘法算法也是一类常见的算法。
C语言的多核编程与并行执行
C语言的多核编程与并行执行概述C语言是一种广泛使用的编程语言,可以用于开发各种类型的应用程序。
在当今计算机硬件技术的快速发展中,多核处理器已经成为主流。
多核处理器具有多个独立的CPU核心,可以同时执行多个任务。
为了充分利用多核处理器的潜力,开发人员需要使用适当的技术和编程模型来进行多核编程和并行执行。
本文将介绍C语言中的多核编程和并行执行的基本概念和技术,并提供一些实例来帮助读者理解。
什么是多核编程和并行执行多核编程是指在多核处理器上编写代码以利用多个CPU核心并行执行任务的过程。
在单核处理器上,程序的执行是线性的,即一次只能执行一个指令。
而在多核处理器上,不同的CPU核心可以同时执行不同的代码片段,从而加快程序的执行速度。
并行执行是指多个任务同时进行,每个任务在一个独立的线程中执行。
通过在不同的CPU核心上创建线程,可以实现多个任务的并行执行。
多核编程的挑战虽然多核处理器有助于提高计算机系统的性能,但多核编程也带来了一些挑战。
以下是一些常见的挑战:数据共享和同步在多核编程中,多个线程可以同时访问和修改共享的数据。
这可能导致数据竞争和不一致的结果。
为了解决这个问题,开发人员需要使用同步机制来确保线程之间的正确协同工作,例如使用互斥锁、条件变量等。
负载平衡在多核处理器上,任务的负载应该平衡在不同的CPU核心上。
如果负载不平衡,某些核心可能一直处于空闲状态,而其他核心却忙于处理更多的任务。
开发人员需要设计和实现合适的调度算法来平衡任务的负载。
可扩展性多核编程要求程序能够有效地扩展到多个CPU核心上。
如果程序的设计和实现不具备可扩展性,增加CPU核心的数量可能无法提高性能。
开发人员需要使用可扩展的算法和数据结构来实现可扩展的程序。
C语言中的多核编程技术C语言提供了一些用于多核编程的技术和库。
以下是一些常用的技术:线程库C语言提供了线程库(pthread)来创建和管理线程。
线程库提供了创建线程、销毁线程、同步线程等功能。
里仁多核程序设计实验报告
E[i] = B[i + 5000];//将B[]的后5000个数放入E[]
}
}
#pragma omp parallel default(none) shared(E,D,short_len) //private(i)------快速排序的并行region
#include "stdafx.h"
#include <omp.h>
#include <stdio.h>
#include <time.h>
#define NN 2000
int A[NN][NN], B[NN][NN];
long long C[NN][NN];
void solve(int n, int num_thread){
printf("\nTotal Time: %f ms.\n", dResult);
system("pause");
return 0;
}
五.结果分析
运行时间是串行的一半。明显降低了时间的消耗。
实验二
一.实验目的与要求
二.实验环境及软件
三.实验内容
以矩阵乘进行并行串行比较
四.实验代码和结果
实验代码:
// juzhencheng.cpp :定义控制台应用程序的入口点。
start_time=clock();
#pragma omp parallel sections reduction(+:sum) private(x,i)
{
#pragma omp section
多核编程实验报告1
实验一:Windows*Threads多线程编程模块一:基础练习1. 编译执行,输出结果:(1)简答与思考:修改后的HelloThreads的代码:1// HelloThreads.cpp : 定¡§义°?控?制?台¬¡§应®|用®?程¨¬序¨°的Ì?入¨?口¨²点Ì?。
¡ê23#include"stdafx.h"4#include<windows.h>5const int numThreads = 4;6DWORD WINAPI helloFunc(LPVOID pArg)7{8int j = *(int *)pArg;9printf("Hello Thread %d\n",j);10return 0;11}12int _tmain(int argc, _TCHAR* argv[])13{14 HANDLE hThread[numThreads];15int tNum[4];16for (int i = 0; i < numThreads; i++)17 { tNum[i]=i;18hThread[i] =19CreateThread(NULL, 0, helloFunc, &tNum[i], 0, NULL );20 }21 WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);22return 0;23}运行结果图:(2)实验总结:模块二:临界区实验1.串行程序编译执行,Pi的值为:(截图)(3) 2.改为并行程序编译执行,Pi的值为:(截图)(4)简答与思考:3.如何进行并行化的?请写出并行化的思路与具体的代码。
多核研究性课题实验报告
辽宁师范大学计算机与信息技术学院综合性实验报告课程名称:多核并行程序设计实验题目:基于主成分分析的并行程序设计学生姓名:孙蕾专业:计算机科学与技术学号: 20101118050005实验日期: 2012年11月25日实验成绩:一、实验目的通过对主成分分析法进行研究,了解主成分分析在生产生活中的重要应用性。
在此基础上找到算法,给出计算对称矩阵特征值的串行算法,并在此基础上利用多核程序设计将其并行化,以优化运行速度。
通过本实验了解并行程序设计原理并达到基本能应用的水平。
二、实验内容1.对主成分分析法进行学习,明白其原理以及在现实生活中的应用方面和实际意义。
2.按照对主成分分析的理解找到计算特征值的算法并完成串行程序。
3.在串行程序的基础上应用多核程序设计的原理将程序并行化,分别对串行程序和并行程序计算运行时间,计算加速比,加深多核程序设计的理解。
4.总结研究中的问题以及克服方法,心得和体会。
三、实验过程(含结果抓图)1.串行程序代码及结果抓图#include<iostream.h>#include<stdlib.h>#include<math.h>#include<iomanip.h>//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //class Matrix定义矩阵类const int Max_xy=20; //矩阵的最大维数class Matrix{private:double data[Max_xy][Max_xy];unsigned x,y; //x,y;public:Matrix(); //默认构造函数Matrix(const Matrix & source); //拷贝构造函数void creat(); //输入矩阵void init();void transpose(); //矩阵转置void show(); //输入此矩阵double mode() const; //求一维矩阵的长度void check_shiduichen(); //检查是否为是对称矩阵void creat_unit(unsigned i); //生成i行单位矩阵void set_x(unsigned xx); //设置行数void set_y(unsigned yy); //设置列数unsigned get_x(); //得到行数unsigned get_y(); //得到列数void shucheng(double changshu); //数乘运算void setdata(unsigned i,unsigned j,double source); //定位输入数据double getdata(unsigned i,unsigned j); //定位得到数据void sturm(); //求特征值unsigned sturm_s(double m); //计算sturm系列的同好数Matrix operator = (const Matrix & right);friend Matrix & operator + (const Matrix & left,const Matrix & right); //重载+号friend Matrix & operator - (const Matrix & left,const Matrix & right); //重载-号friend Matrix & operator * (const Matrix & left,const Matrix & right); //重载乘号friend ostream& operator <<(ostream & os,const Matrix & source); //重载输出friend void Householder(Matrix & source); //用Householde矩阵将实对称矩阵化为三对角矩阵};Matrix temp_Matrix; //全局变量Matrix//===================================================================//--------------------默认构造函数Matrix::Matrix(){init();}//----------------------------拷贝构造函数Matrix::Matrix(const Matrix & source){init();x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];}//------------------------------------------初始化矩阵元素void Matrix::init(){x=y=0;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<Max_xy;j++)data[i][j]=0;}//------------------------------矩阵转置void Matrix::transpose(){double temp;int t;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<=i;j++){temp=data[i][j];data[i][j]=data[j][i];data[j][i]=temp;}t=x;x=y;y=t;}//--------------------------------------求一维矩阵的长度double Matrix::mode() const{double s=0;unsigned i,j;if(x==1)for(i=0,j=0;j<y;j++)s+=data[i][j]*data[i][j];else if(y==1)for(i=0,j=0;i<x;i++)s+=data[i][j]*data[i][j];else{cout<<"\n不是一维的!";exit(0);}s=sqrt(s);return (s);}//----------------------------------------重载=号Matrix Matrix::operator = (const Matrix & source){x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];return *this;}//-------------------------------------------重载+号Matrix & operator + (const Matrix & left,const Matrix & right){if(left.x!=right.x || left.y!=right.y){cout<<"\n维数不相等,不能相加!";exit(0);}for(unsigned i=0;i<left.x;i++)for(unsigned j=0;j<left.y;j++)temp_Matrix.data[i][j]=right.data[i][j] + left.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//---------------------------------------------重载+号Matrix & operator - (const Matrix & left,const Matrix & right){if(left.x!=right.x || left.y!=right.y){cout<<"\n维数不相等,不能相减!";exit(0);}for(unsigned i=0;i<left.x;i++)for(unsigned j=0;j<left.y;j++)temp_Matrix.data[i][j]=left.data[i][j] - right.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//----------------------------------------重载乘号Matrix & operator * (const Matrix & left,const Matrix & right){if(left.y!=right.x){cout<<"\n两个矩阵相乘错误.";exit(0);}temp_Matrix.init();unsigned i,j,k;for(i=0;i<left.x;i++)for(j=0;j<right.y;j++)for(k=0;k<left.y;k++)temp_Matrix.data[i][j]+=left.data[i][k] * right.data[k][j];temp_Matrix.x=left.x;temp_Matrix.y=right.y;return temp_Matrix;}//-------------------------------------------输入矩阵void Matrix::creat(){cout<<"输如行列式:";cout<<"\n行数:";cin>>x;cout<<"列数:";cin>>y;for(unsigned i=0;i<x;i++){cout<<"输入第"<<i+1<<"行:";for(unsigned j=0;j<y;j++)cin>>data[i][j];}}//----------------------------------------------输出矩阵void Matrix::show(){unsigned i,j;cout<<"\n\n矩阵表示如下:";for(i=0;i<x;i++){cout<<endl;for(j=0;j<y;j++)cout<<setw(7)<<setiosflags(ios::left)<<data[i][j];}}//----------------------------------用Householder矩阵化为实对称矩阵void Householder(Matrix & source){unsigned i,lenth,k,m,n,flag;double temp_lie_x[Max_xy],temp_lie_y[Max_xy],temp[Max_xy];double s;for(i=0;i<source.x-2;i++){for(k=0;k<Max_xy;k++){ //初始化为0temp_lie_x[k]=0;temp_lie_y[k]=0;temp[k]=0;}for(lenth=0;lenth+i+1<source.x;lenth++) //提取第data[i+1][i]到data[x-1][i]的数据存到temp_lie[Max_xy];temp_lie_x[lenth]=source.data[lenth+i+1][i];for(k=0,s=0;k<lenth;k++) //j为临时变量的个数.s+=temp_lie_x[k]*temp_lie_x[k];s=sqrt(s);temp_lie_y[0]=-s;for(k=1;k<lenth;k++)temp_lie_y[k]=0;for(k=0;k<lenth;k++)temp[k]=temp_lie_x[k]-temp_lie_y[k];for(k=0,flag=0;k<lenth;k++) //假如以上两个向量相等则退出,则跳出以进行下一次变换if(temp[k]!=0){flag=1;break;}if(flag==0)continue;Matrix part_h,I,x_y; //定义Matrix变量I.creat_unit(lenth);x_y.x=lenth,x_y.y=1;//对x_y赋值for(k=0;k<lenth;k++)x_y.data[k][0]=temp[k];//求x_y的转置Matrix zhuanzhi_x_y( x_y ); //拷贝构造函数zhuanzhi_x_y.transpose();s=2.0 / ( x_y.mode() * x_y.mode() );x_y.shucheng(s);temp_Matrix=x_y * zhuanzhi_x_y;part_h=I- x_y*zhuanzhi_x_y;Matrix H;H.creat_unit(source.x);for(m=i+1;m<source.x;m++)for(n=i+1;n<source.y;n++)H.data[m][n]=part_h.data[m-i-1][n-i-1]; //得到最后的Householder 矩阵source=source * H;source=H * source;}for(i=0;i<source.x;i++)for(k=0;k<source.y;k++)if(fabs(source.data[i][k]) < 1e-13)source.data[i][k]=0;//------------------------------------检查是否为实对称矩阵void Matrix::check_shiduichen(){if(x!=y){cout<<"\n\n不是是对称矩阵(行列不相等)\n\n";exit(0);}for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++){if(data[i][j]!=data[j][i]){cout<<"\n\n不是实对称矩阵!(不对称!)\n\n";exit(0);}}}ostream & operator <<(ostream & os,const Matrix & source){unsigned i,j;for(i=0;i<source.x;i++){os<<"\n";for(j=0;j<source.y;j++)os<<setw(10)<<setiosflags(ios::left)<<source.data[i][j]<<"\t";}os<<endl;return os;}void Matrix::set_x(unsigned xx) //设置行数{x=xx;}void Matrix::set_y(unsigned yy) //设置列数{y=yy;}unsigned Matrix::get_x() //得到行数{return x;}unsigned Matrix::get_y() //得到列数{return y;}double Matrix::getdata(unsigned i,unsigned j) //定位得到数据{return data[i][j];}void Matrix::setdata(unsigned i,unsigned j,double source){data[i][j]=source;if(x<i) x=i;if(y<j) y=j;}void Matrix::creat_unit(unsigned lenth) //生成i行单位矩阵{init();x=y=lenth;for(unsigned i=0;i<lenth;i++)data[i][i]=1;}void Matrix::shucheng(double changshu) //数乘运算{unsigned i,j;for(i=0;i<x;i++)for(j=0;j<y;j++)data[i][j]*=changshu;}void Matrix::sturm(){double s,r,maxhang,a,b;unsigned i,j,m;for(i=0,maxhang=0;i<x;i++){ for( s=0,j=0;j<y;j++)s+=fabs(data[i][j]);if(s>maxhang)maxhang=s;}a=-maxhang;b=maxhang;m=sturm_s(a)-sturm_s(b);for(i=1;i<=m;i++){a=-maxhang;b=maxhang;do{r=0.5*(a+b);if(sturm_s(r)>=i)a=r;elseb=r;}while(fabs(a-b)>1e-11);cout<<"\n特征值"<<i<<": "<<setiosflags(ios::left)<<setw(10)<<setprecision(10) <<setiosflags(ios::fixed)<<0.5*(a+b);}}unsigned Matrix::sturm_s(double r){double p[Max_xy+1];int temp[Max_xy+1];unsigned m,i;p[0]=1;p[1]=data[0][0]-r;for(i=2;i<=x;i++)p[i]=(data[i-1][i-1]-r)*p[i-1]-data[i-2][i-1]*data[i-2][i-1]*p[i-2];temp[0]=1;for(i=1;i<=x;i++)if(p[i]>1e-14)temp[i]=1;else if(p[i]<-1e-14)temp[i]=-1;elsetemp[i]=temp[i-1];for(i=1,m=0;i<=x;i++)if(temp[i]+temp[i-1]!=0)m++;return m;}int _tmain(int argc, _TCHAR* argv[]){double begin,end,time;begin=(double)clock()/(double)CLK_TCK;Matrix a;a.creat();cout<<"输º?入¨?的Ì?矩?阵¨®为a:";cout<<a;a.check_shiduichen();Householder(a);cout<<"用Householder化¡为实对称矩阵为a:";cout<<a;a.sturm();cout<<endl;end=(double)clock()/(double)CLK_TCK;time=end-begin;cout<<"时间是:";cout<<time;return 0;}串行运行结果:2.并行程序代码及结果抓图// bingxing.cpp : 定义控制台应用程序的入口点//// c.cpp : 定义控制台应用程序的入口点//#include "stdafx.h"#include <iostream>#include <stdlib.h>#include <math.h>#include <iomanip>#include <omp.h>using namespace s td;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //class Matrix定¡§义°?矩?阵¨®类¤¨¤const int Max_xy=20;//矩?阵¨®的Ì?最Á?大䨮维?数ºyclass Matrix{private:double data[Max_xy][Max_xy];unsigned x,y; //x,y;public:Matrix(); //默?认¨?构1造¨¬函¡¥数ºyMatrix(const Matrix & source); //拷?贝À¡ä构1造¨¬函¡¥数ºyvoid creat(); //输º?入¨?矩?阵¨®void init();void transpose(); //矩?阵¨®转Áa置?void show(); //输º?入¨?此ä?矩?阵¨®double mode() const; //求¨®一°?维?矩?阵¨®的Ì?长¡è度¨¨void check_shiduichen(); //检¨¬查¨¦是º?否¤?为a是º?对?称?矩?阵¨®void creat_unit(unsigned i); //生¦¨²成¨¦i行D单Ì£¤位?矩?阵¨®void set_x(unsigned xx); //设¦¨¨置?行D数ºyvoid set_y(unsigned yy); //设¦¨¨置?列¢D数ºyunsigned get_x(); //得Ì?到Ì?行D数ºyunsigned get_y(); //得Ì?到Ì?列¢D数ºyvoid shucheng(double changshu); //数ºy乘?运?算?void setdata(unsigned i,unsigned j,double source); //定¡§位?输º?入¨?数ºy据Ydouble getdata(unsigned i,unsigned j); //定¡§位?得Ì?到Ì?数ºy据Yvoid sturm(); //求¨®特¬?征¡Â值¦Ìunsigned sturm_s(double m); //计?算?sturm系¦Ì列¢D的Ì?同ª?好?数ºy Matrix operator = (const Matrix & right);friend Matrix & operator + (const Matrix & left,const Matrix & right); //重?载?+号?friend Matrix & operator - (const Matrix & left,const Matrix & right); //重?载?-号?friend Matrix & operator * (const Matrix & left,const Matrix & right); //重?载?乘?号?friend ostream& operator <<(ostream & os,const Matrix & source); //重?载?输º?出?friend void Householder(Matrix & source); //用®?Householde矩?阵¨®将?实º¦Ì对?称?矩?阵¨®化¡¥为a三¨y对?角?矩?阵¨®};Matrix temp_Matrix; //全¨?局?变À?量¢?Matrix//===================================================================//--------------------默?认¨?构1造¨¬函¡¥数ºyMatrix::Matrix(){init();}//----------------------------拷?贝À¡ä构1造¨¬函¡¥数ºyMatrix::Matrix(const Matrix & source){init();x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];}//------------------------------------------初?始º?化¡¥矩?阵¨®元a素? void Matrix::init(){x=y=0;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<Max_xy;j++)data[i][j]=0;}//------------------------------矩?阵¨®转Áa置?void Matrix::transpose(){double temp;int t;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<=i;j++){temp=data[i][j];data[i][j]=data[j][i];data[j][i]=temp;}t=x;x=y;y=t;}//--------------------------------------求¨®一°?维?矩?阵¨®的Ì?长¡è度¨¨double Matrix::mode() const{double s=0;unsigned i,j;if(x==1)for(i=0,j=0;j<y;j++)s+=data[i][j]*data[i][j];else if(y==1)for(i=0,j=0;i<x;i++)s+=data[i][j]*data[i][j];else{cout<<"\n不?是º?一°?维?的Ì?!";exit(0);}s=sqrt(s);return (s);}//----------------------------------------重?载?=号?Matrix Matrix::operator = (const Matrix & source){x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];return *this;}//-------------------------------------------重?载?+号?Matrix & operator + (const Matrix & left,const Matrix & right){ int j;if(left.x!=right.x || left.y!=right.y){cout<<"\n维?数ºy不?相¨¤等̨¨,不?能¨¹相¨¤加¨®!";exit(0);}for(unsigned i=0;i<left.x;i++)#pragma omp parallel for private(j)for( j=0;j<left.y;j++)temp_Matrix.data[i][j]=right.data[i][j] + left.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//---------------------------------------------重?载?-号?Matrix & operator - (const Matrix & left,const Matrix & right){if(left.x!=right.x || left.y!=right.y){cout<<"\n维?数ºy不?相¨¤等̨¨,不?能¨¹相¨¤减?!";exit(0);}for(unsigned i=0;i<left.x;i++)for(unsigned j=0;j<left.y;j++)temp_Matrix.data[i][j]=left.data[i][j] - right.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//----------------------------------------重?载?乘?号?Matrix & operator * (const Matrix & left,const Matrix & right){if(left.y!=right.x){cout<<"\n两¢?个?矩?阵¨®相¨¤乘?错䨪误¨®.";exit(0);}temp_Matrix.init();unsigned i,j,k;for(i=0;i<left.x;i++)for(j=0;j<right.y;j++)for(k=0;k<left.y;k++)temp_Matrix.data[i][j]+=left.data[i][k] * right.data[k][j];temp_Matrix.x=left.x;temp_Matrix.y=right.y;return temp_Matrix;}//-------------------------------------------输º?入¨?矩?阵¨®void Matrix::creat(){cout<<"输º?如¨?行D列¢D式º?:";cout<<"\n行D数ºy:";cin>>x;cout<<"列¢D数ºy:";cin>>y;for(unsigned i=0;i<x;i++){cout<<"输º?入¨?第̨²"<<i+1<<"行D:";for(unsigned j=0;j<y;j++)cin>>data[i][j];}}//----------------------------------------------输º?出?矩?阵¨®void Matrix::show(){unsigned i,j;cout<<"\n\n矩?阵¨®表À¨ª示º?如¨?下?:";for(i=0;i<x;i++){cout<<endl;for(j=0;j<y;j++)cout<<setw(7)<<setiosflags(ios::left)<<data[i][j];}}//----------------------------------用®?Householder矩?阵¨®化¡¥为a实º¦Ì对?称?矩?阵¨®void Householder(Matrix & source){for(i=0;i<source.x-2;i++){#pragma omp parallel for private(k)for(k=0;k<Max_xy;k++){ //初?始º?化¡¥为a0temp_lie_x[k]=0;temp_lie_y[k]=0;temp[k]=0;}for(lenth=0;lenth+i+1<source.x;lenth++) //提¬¨¢取¨?第̨²data[i+1][i]到Ì?data[x-1][i]的Ì?数ºy 据Y存ä?到Ì?temp_lie[Max_xy];temp_lie_x[lenth]=source.data[lenth+i+1][i];for(k=0,s=0;k<lenth;k++) //j为a临¢¨´时º¡À变À?量¢?的Ì?个?数ºy.s+=temp_lie_x[k]*temp_lie_x[k];s=sqrt(s);temp_lie_y[0]=-s;for(k=1;k<lenth;k++)temp_lie_y[k]=0;for(k=0;k<lenth;k++)temp[k]=temp_lie_x[k]-temp_lie_y[k];for(k=0,flag=0;k<lenth;k++) //假¨´如¨?以°?上¦?两¢?个?向¨°量¢?相¨¤等̨¨则¨°退ª?出?,则¨°跳¬?出?以°?进?行D下?一°?次ä?变À?换?if(temp[k]!=0){flag=1;break;}if(flag==0)continue;Matrix part_h,I,x_y; //定¡§义°?Matrix变À?量¢?I.creat_unit(lenth);x_y.x=lenth,x_y.y=1;//对?x_y赋3值¦Ìfor(k=0;k<lenth;k++)x_y.data[k][0]=temp[k];//求¨®x_y的Ì?转Áa置?Matrix zhuanzhi_x_y( x_y ); //拷?贝À¡ä构1造¨¬函¡¥数ºyzhuanzhi_x_y.transpose();s=2.0 / ( x_y.mode() * x_y.mode() );x_y.shucheng(s);temp_Matrix=x_y * zhuanzhi_x_y;part_h=I- x_y*zhuanzhi_x_y;Matrix H;H.creat_unit(source.x);for(m=i+1;m<source.x;m++)for(n=i+1;n<source.y;n++)H.data[m][n]=part_h.data[m-i-1][n-i-1]; //得Ì?到Ì?最Á?后¨®的Ì?Householder矩?阵¨®source=source * H;source=H * source;}for(i=0;i<source.x;i++)for(k=0;k<source.y;k++)if(fabs(source.data[i][k]) < 1e-13)source.data[i][k]=0;}//------------------------------------检¨¬查¨¦是º?否¤?为a实º¦Ì对?称?矩?阵¨®void Matrix::check_shiduichen(){if(x!=y){cout<<"\n\n不?是º?是º?对?称?矩?阵¨®(行D列¢D不?相¨¤等̨¨)\n\n";exit(0);}for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++){if(data[i][j]!=data[j][i]){cout<<"\n\n不?是º?实º¦Ì对?称?矩?阵¨®!(不?对?称?!)\n\n";exit(0);}}}ostream & operator <<(ostream & os,const Matrix & source){unsigned i,j;for(i=0;i<source.x;i++){os<<"\n";for(j=0;j<source.y;j++)os<<setw(10)<<setiosflags(ios::left)<<source.data[i][j]<<"\t";}os<<endl;return os;}void Matrix::set_x(unsigned xx) //设¦¨¨置?行D数ºy{x=xx;}void Matrix::set_y(unsigned yy) //设¦¨¨置?列¢D数ºy{y=yy;}unsigned Matrix::get_x() //得Ì?到Ì?行D数ºy{return x;}unsigned Matrix::get_y() //得Ì?到Ì?列¢D数ºy{return y;}double Matrix::getdata(unsigned i,unsigned j) //定¡§位?得Ì?到Ì?数ºy据Y {return data[i][j];}void Matrix::setdata(unsigned i,unsigned j,double source){data[i][j]=source;if(x<i) x=i;if(y<j) y=j;}void Matrix::creat_unit(unsigned lenth) //生¦¨²成¨¦i行D单Ì£¤位?矩?阵¨®{init();x=y=lenth;for(unsigned i=0;i<lenth;i++)data[i][i]=1;}void Matrix::shucheng(double changshu) //数ºy乘?运?算?加¨®入¨?并¡é行D语®?句? {int i,j;omp_set_num_threads(3);#pragma omp parallel forfor(i=0;i<x;i++)for(j=0;j<y;j++)data[i][j]*=changshu;}void Matrix::sturm(){double s,r,maxhang,a,b;unsigned i,j,m;for(i=0,maxhang=0;i<x;i++){ for( s=0,j=0;j<y;j++)s+=fabs(data[i][j]);if(s>maxhang)maxhang=s;}a=-maxhang;b=maxhang;m=sturm_s(a)-sturm_s(b);for(i=1;i<=m;i++){a=-maxhang;b=maxhang;do{r=0.5*(a+b);if(sturm_s(r)>=i)a=r;elseb=r;}while(fabs(a-b)>1e-11);cout<<"\n特¬?征¡Â值¦Ì"<<i<<": "<</*setiosflags(ios::left)<<setw(10)<<*/setprecision(10) <<setiosflags(ios::fixed)<<0.5*(a+b);}}unsigned Matrix::sturm_s(double r){double p[Max_xy+1];int temp[Max_xy+1];unsigned m,i;p[0]=1;p[1]=data[0][0]-r;for(i=2;i<=x;i++)p[i]=(data[i-1][i-1]-r)*p[i-1]-data[i-2][i-1]*data[i-2][i-1]*p[i-2];temp[0]=1;for(i=1;i<=x;i++)if(p[i]>1e-14)temp[i]=1;else if(p[i]<-1e-14)temp[i]=-1;elsetemp[i]=temp[i-1];for(i=1,m=0;i<=x;i++)if(temp[i]+temp[i-1]!=0)m++;return m;}int _tmain(int argc, _TCHAR* argv[]){double begin,end,time;begin=(double)clock()/(double)CLK_TCK;Matrix a;a.creat();cout<<"输º?入¨?的Ì?矩?阵¨®为a:";cout<<a;a.check_shiduichen();Householder(a);cout<<"用®?Householder化¡¥为a实º¦Ì对?称?矩?阵¨®为a:";cout<<a;a.sturm();cout<<endl;end=(double)clock()/(double)CLK_TCK;time=end-begin;cout<<"时º¡À间?是º?:êo";cout<<time;return 0;}程序运行结果:四、实验结果分析(运行过程中出现的问题、如何解决的;实验过程中的经验及教训)并行化结果展示:3*3维矩阵串行程序时间:t1=9.81ms并行程序时间:t2=7.612ms加速比=20.81ms/7.612=2.733并行化结果展示:10*10维矩阵串行程序时间:t1=144.581ms并行程序时间:t2=109.699ms加速比=144.581ms/109.699ms=1.317并行化结果展示:15*15维矩阵串行程序时间:t1=365.461ms并行程序时间:t2=290.316ms加速比=365.461ms/290.316ms=1.255体现了并行的优越性。
多核处理器的应用及并行编程技术研究
多核处理器的应用及并行编程技术研究一、多核处理器的概念和作用随着计算机技术的发展,单核处理器的性能已经难以满足人们对计算能力的需求。
因此,多核处理器应运而生,它是指在相同物理芯片上,集成了两个或更多的中央处理器 (CPU) 核心。
多核处理器与单核处理器相比,在同样的时钟频率下,可以达到更高的计算性能。
多核处理器是现代计算机科学和工业领域的一个重要发展方向。
它的应用领域涉及广泛,包括服务器、超级计算机、工业控制、机器视觉、智能手机和移动设备等。
二、多核处理器的应用1. 服务器多核处理器在服务器领域的应用最为广泛。
在数据中心中,服务器使用多核处理器来支持大规模并行处理,从而提高数据处理速度和效率。
例如,谷歌公司的数据中心使用多核处理器和分布式计算框架,支持海量用户的搜索和数据分析。
2. 超级计算机超级计算机是一种高性能计算机,它通常使用多核处理器,以达到更高的计算速度和功率。
在超级计算机领域,多核处理器可以同时处理多个计算任务,从而加快计算速度。
例如,中国的天河二号超级计算机使用了万亿次级别的多核处理器来加速高性能计算。
3. 工业控制多核处理器在工业控制领域的应用也十分广泛,它可以增强设备的处理能力和速度,提高生产效率和质量。
例如,汽车生产线上的机器人需要实时处理大量的传感器数据,多核处理器可以满足这种要求。
4. 机器视觉机器视觉是一种新兴的技术,它可以使计算机像人一样“看”和“理解”图像。
多核处理器在机器视觉领域的应用也非常广泛,例如人脸识别、自动驾驶汽车和无人机等技术。
5. 智能手机和移动设备智能手机和移动设备现在已经成为人们日常生活的必需品。
多核处理器可以加快智能手机和移动设备的性能,使它们可以更好地支持高清视频播放、游戏和其他计算密集型应用。
三、并行编程技术并行编程是一种将计算任务分解成多个子任务,由多个处理器同时执行的编程方法。
它是利用多核处理器的重要手段,可以大幅提高系统的运行速度和效率。
并行计算实验报告
并行计算实验报告并行计算实验报告引言:并行计算是一种有效提高计算机性能的技术,它通过同时执行多个计算任务来加速计算过程。
在本次实验中,我们将探索并行计算的原理和应用,并通过实验验证其效果。
一、并行计算的原理并行计算是指将一个计算任务分成多个子任务,并通过多个处理器同时执行这些子任务,以提高计算速度。
其原理基于两个关键概念:任务划分和任务调度。
1. 任务划分任务划分是将一个大的计算任务划分成多个小的子任务的过程。
划分的目标是使得每个子任务的计算量尽可能均衡,并且可以并行执行。
常见的任务划分方法有数据划分和功能划分两种。
- 数据划分:将数据分成多个部分,每个处理器负责处理其中一部分数据。
这种划分适用于数据密集型的计算任务,如图像处理和大规模数据分析。
- 功能划分:将计算任务按照功能划分成多个子任务,每个处理器负责执行其中一个子任务。
这种划分适用于计算密集型的任务,如矩阵运算和模拟仿真。
2. 任务调度任务调度是将划分后的子任务分配给不同的处理器,并协调它们的执行顺序和通信。
任务调度的目标是最大程度地减少处理器之间的等待时间和通信开销,以提高整体计算效率。
二、并行计算的应用并行计算广泛应用于科学计算、大数据处理、人工智能等领域。
它可以加速计算过程,提高计算机系统的性能,并解决一些传统计算方法难以处理的问题。
1. 科学计算并行计算在科学计算中起到至关重要的作用。
例如,在天气预报模型中,通过将地球划分成多个网格,每个处理器负责计算其中一个网格的气象数据,可以加快模型的计算速度,提高预报准确性。
2. 大数据处理随着大数据时代的到来,传统的串行计算方法已经无法满足大规模数据的处理需求。
并行计算可以将大数据分成多个部分,通过多个处理器同时处理,提高数据的处理速度。
例如,谷歌的分布式文件系统和MapReduce框架就是基于并行计算的思想。
3. 人工智能人工智能算法通常需要大量的计算资源来进行模型训练和推理。
并行计算可以在多个处理器上同时执行算法的计算任务,加快模型的训练和推理速度。
多核实验报告
多核实验报告多核实验报告引言:随着科技的迅猛发展,计算机技术也在不断进步。
多核处理器作为一种新型的计算机处理器,其在计算速度和性能方面具有明显的优势。
本篇文章将对多核实验进行报告,介绍多核处理器的原理、应用和实验结果。
一、多核处理器的原理多核处理器是指在一颗芯片上集成了多个处理核心的处理器。
每个处理核心都可以独立运行任务,相互之间可以并行工作,从而提高计算机的运算速度和性能。
多核处理器的原理主要包括任务分配、线程同步和资源共享。
1. 任务分配:多核处理器通过将任务分配给不同的处理核心来实现并行计算。
任务分配可以根据任务的类型、优先级和处理核心的负载情况来进行动态调度,以达到最优的计算效果。
2. 线程同步:在多核处理器中,不同的处理核心可能同时运行多个线程。
为了保证线程之间的协调和同步,需要使用同步机制,如互斥锁、信号量等。
线程同步可以避免数据竞争和死锁等问题,确保程序的正确执行。
3. 资源共享:多核处理器中的处理核心共享一些资源,如内存、缓存等。
为了避免资源竞争和冲突,需要采取一些策略,如缓存一致性协议、内存隔离等。
资源共享可以提高资源利用率,减少系统开销。
二、多核处理器的应用多核处理器在各个领域都有广泛的应用。
下面以几个典型的应用领域为例进行介绍。
1. 科学计算:在科学计算领域,多核处理器可以加速复杂的数值计算和模拟计算。
通过将计算任务分配给多个处理核心并行执行,可以大大缩短计算时间,提高计算效率。
2. 图像处理:多核处理器可以在图像处理中发挥重要作用。
通过并行处理图像的各个部分,可以实现实时的图像处理和图像识别。
同时,多核处理器还可以提供更高的图像处理质量和效果。
3. 数据库管理:在大规模数据库管理中,多核处理器可以提供更高的数据库查询和处理速度。
通过并行处理查询请求和数据操作,可以提高数据库的响应速度和吞吐量,满足用户对大数据量处理的需求。
三、多核实验结果为了验证多核处理器的性能和效果,我们进行了一系列的实验。
基于多核处理器的并行计算研究
基于多核处理器的并行计算研究在当今数字化时代,数据量和复杂性不断增长,对计算机的处理能力提出了更高的要求。
单核处理器已经无法满足快速高效的计算需求,因此,多核处理器成为了日益成熟和广泛应用的计算平台。
基于多核处理器的并行计算,提供了更高效,更灵活的计算能力,已经成为许多学科领域研究的基础。
一、多核处理器的并行计算技术概述多核处理器是指CPU上集成了多个处理器核心,可以同时处理多个任务。
多核的出现使得计算机可以在几个核心上同时执行任务和程序,获得更快的计算速度。
可以看到,处理器的性能已不仅仅取决于处理器的主频,更重要的是它的优化。
并行计算技术是优化计算机计算速度的重要手段,基于多核的并行计算,显著提升了计算机的性能。
并行计算技术是指同时开始执行多个程序或任务的一种计算机计算方式。
基于多核处理器的并行计算技术主要包括共享内存并行和分布式内存并行两种模式。
共享内存并行是指多个处理器共享同一块物理内存,从而实现数据之间的共享。
多个处理器可以同时访问共享内存中的数据,同时执行操作,共享内存需要一些特殊的技术来对其访问和同步进行协调。
分布式内存并行则是将分布于不同机器上的内存联合在一起,在计算过程中通过网络交换来共享数据。
分布式内存并行处理是一个更大的话题。
在本文中,我们将专注于共享内存并行的研究。
二、多核处理器的并行计算应用基于多核并行的计算已经广泛地应用于科学研究和工程应用领域,在大规模计算和数据分析领域有着广泛的应用。
在科学研究方面,高性能计算已经成为许多学科研究的核心。
例如,在生物学和医学领域,研究人员使用多核处理器的并行计算技术来处理大量的基因数据和医学图像,以分析和理解人类基因和疾病。
在物理学和天文学领域,高性能计算机可以用于模拟和分析天体物理现象,以及大型物理实验数据的收集、处理和分析。
在这些应用场景中,多核处理器的并行计算对于加速代码的求解和处理大规模数据尤为重要。
在工程应用方面,高性能计算已经成为了许多设计优化和仿真方案的不可或缺的工具。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多核编程与并行计算实验报告姓名:日期:2014年 4月20日实验一// exa1.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;void ThreadFunc1(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc1"<<endl;}}void ThreadFunc2(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc2"<<endl;}}int main(){int i=0;_beginthread(ThreadFunc1,0,NULL);_beginthread(ThreadFunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return 0;}实验二// exa2.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<iostream>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, NULL); HANDLE hand2=CreateThread (NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return 0;}实验三// exa3.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream>using namespace std;int globalvar = false;DWORD WINAPI ThreadFunc(LPVOID pParam){cout<<"ThreadFunc"<<endl;Sleep(200);globalvar = true;return 0;}int main(){HANDLE hthread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);if (!hthread){cout<<"Thread Create Error ! "<<endl;CloseHandle(hthread);}while (!globalvar)cout<<"Thread while"<<endl;cout<<"Thread exit"<<endl;return 0;}实验四:// exa4.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;HANDLE evRead, evFinish;void ReadThread(LPVOID param){WaitForSingleObject (evRead ,INFINITE);cout<<"Reading"<<endl;SetEvent (evFinish);}void WriteThread(LPVOID param){cout<<"Writing"<<endl;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"<<endl;return 0 ;}实验五// exa5.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;int total = 100 ;HANDLE evFin[2] ;CRITICAL_SECTION cs ;void WithdrawThread1(LPVOID param){EnterCriticalSection(&cs) ;if ( total-90 >= 0){total -= 90 ;cout<<"You withdraw 90"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;SetEvent (evFin[0]) ;}void WithdrawThread2(LPVOID param){EnterCriticalSection(&cs) ;if ( total-20 >= 0){total -= 20 ;cout<<"You withdraw 20"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;LeaveCriticalSection(&cs) ;SetEvent (evFin[1]) ;}int main(int argc , char * argv[]){evFin[0] = CreateEvent (NULL,FALSE,FALSE,NULL) ;evFin[1] = CreateEvent (NULL,FALSE,FALSE,NULL) ;InitializeCriticalSection(&cs) ;_beginthread(WithdrawThread1 , 0 , NULL) ;_beginthread(WithdrawThread2 , 0 , NULL) ;WaitForMultipleObjects(2 ,evFin ,TRUE ,INFINITE) ;DeleteCriticalSection(&cs) ;cout<<total<<endl;return 0 ;}实验六:// exa6.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;DWORD ThreadProc(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hMutex;cout << "ThreadProc: " << ThreadNumberTemp << " is running!" << endl;if ((hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { cout << "Open Mutex error!" << endl;}cout << "ThreadProc " << ThreadNumberTemp << " gets the mutex"<< endl;ReleaseMutex(hMutex);CloseHandle(hMutex);return 0;}int main(int argc, char* argv[]){int i;DWORD ID[THREAD_INSTANCE_NUMBER];HANDLE h[THREAD_INSTANCE_NUMBER];HANDLE hMutex;if ( (hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { if ((hMutex = CreateMutex(NULL, FALSE, "Mutex.Test")) == NULL ) { cout << "Create Mutex error!" << endl;return 0;}}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){h[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc,(void *)&ID[i],0,&(ID[i]));if (h[i] == NULL)cout << "CreateThread error" << ID[i] << endl;elsecout << "CreateThread: " << ID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,h,TRUE,INFINITE);cout << "Close the Mutex Handle! " << endl;CloseHandle(hMutex);return 0;}实验七// exa7.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3DWORD foo(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hSemaphore;cout << "foo: " << ThreadNumberTemp << " is running!" << endl;if ((hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Semaphore.Test")) == NULL) {cout << "Open Semaphore error!" << endl;}cout << "foo " << ThreadNumberTemp << " gets the semaphore"<< endl;ReleaseSemaphore(hSemaphore, 1, NULL);CloseHandle(hSemaphore);return 0;}int main(int argc, char* argv[]){int i;DWORD ThreadID[THREAD_INSTANCE_NUMBER];HANDLE hThread[THREAD_INSTANCE_NUMBER];HANDLE hSemaphore;if ((hSemaphore = CreateSemaphore(NULL,0,1, "Semaphore.Test")) == NULL ) { cout << "Create Semaphore error!" << endl;return 0;}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){hThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) foo,(void *)&ThreadID[i],0,&(ThreadID[i]));if (hThread[i] == NULL)cout << "CreateThread error" << ThreadID[i] << endl;elsecout << "CreateThread: " << ThreadID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,hThread,TRUE,INFINITE);cout << "Close the Semaphore Handle! " << endl;CloseHandle(hSemaphore);return 0;}实验八:// exa8.cpp : Defines the class behaviors for the application.//#include"stdafx.h"#include"exa8.h"#include"MainFrm.h"#include"exa8Doc.h"#include"exa8View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CExa8AppBEGIN_MESSAGE_MAP(CExa8App, CWinApp)//{{AFX_MSG_MAP(CExa8App)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CExa8App constructionCExa8App::CExa8App(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CExa8App objectCExa8App theApp;/////////////////////////////////////////////////////////////////////////////// CExa8App initializationBOOL CExa8App::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates// serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CExa8Doc),RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CExa8View));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)// No message handlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// App command to run the dialogvoid CExa8App::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}///////////////////////////////////////////////////////////////////////////// // CExa8App message handlers、实验九:using System;using System.Threading;class Test{static void Main(){ThreadStart threadDelegate = new ThreadStart(Work.DoWork);Thread newThread = new Thread(threadDelegate);newThread.Start();Work w = new Work();w.Data = 42;threadDelegate = new ThreadStart(w.DoMoreWork);newThread = new Thread(threadDelegate);newThread.Start();}}class Work{public static void DoWork(){Console.WriteLine("Static thread procedure.");}public int Data;public void DoMoreWork(){Console.WriteLine("Instance thread procedure. Data={0}", Data);}实验十:using System;using System.Threading;class Test{static int total = 100;public static void WithDraw1(){int n=90;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void WithDraw2()int n = 20;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void Main(){ThreadStart thread1 = new ThreadStart(WithDraw1);Thread newThread1 = new Thread(thread1);ThreadStart thread2 = new ThreadStart(WithDraw2);Thread newThread2 = new Thread(thread2);newThread1.Start();newThread2.Start();}}实验十一:// exa11.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<conio.h>#include<stdio.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;CRITICAL_SECTION cs;DWORD ThreadProc1(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc1: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc1 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}DWORD ThreadProc2(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc2: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc2 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}int main(int argc, char* argv[]){int i;DWORD ID1,ID2;HANDLE h1,h2;InitializeCriticalSection(&cs);printf("Create the critical section \n");h1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc1,(void *)&ID1,0,&(ID1));if (h1 == NULL)printf("CreateThread error %d \n",ID1);elseprintf("CreateThread %d \n",ID1);h2= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc2,(void *)&ID2,0,&(ID2));if (h2== NULL)printf("CreateThread error %d \n",ID2);elseprintf("CreateThread %d \n",ID2);WaitForSingleObject (h1,INFINITE);WaitForSingleObject (h2,INFINITE);printf("Delete the critical section \n");DeleteCriticalSection(&cs);getch();return 0;}。