并行计算第一次实验报告

合集下载

并行计算的实验

并行计算的实验

实验一多线程计算π,性能分析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)

多核编程与并行计算实验报告 (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号进程依次接收其它进程发送过来的消息并将其输出。

华科并行实验报告

华科并行实验报告

一、实验模块计算机科学与技术二、实验标题并行计算实验三、实验目的1. 了解并行计算的基本概念和原理;2. 掌握并行编程的基本方法;3. 通过实验加深对并行计算的理解。

四、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 并行计算平台:OpenMP五、实验步骤1. 准备实验环境首先,在计算机上安装OpenMP库,并配置环境变量。

2. 编写并行计算程序编写一个简单的并行计算程序,实现以下功能:(1)计算斐波那契数列的第n项;(2)计算素数的个数;(3)计算矩阵乘法。

以下为斐波那契数列的并行计算程序示例:```cpp#include <omp.h>#include <iostream>using namespace std;int main() {int n = 30;int fib[31] = {0};fib[0] = 0;fib[1] = 1;#pragma omp parallel forfor (int i = 2; i <= n; i++) {fib[i] = fib[i - 1] + fib[i - 2];}cout << "斐波那契数列的第" << n << "项为:" << fib[n] << endl; return 0;}```3. 编译程序使用g++编译器编译程序,并添加OpenMP库支持。

```bashg++ -fopenmp -o fib fib.cpp```4. 运行程序在命令行中运行编译后的程序,观察结果。

5. 分析结果通过对比串行计算和并行计算的结果,分析并行计算的优势。

六、实验过程1. 准备实验环境,安装OpenMP库并配置环境变量;2. 编写并行计算程序,实现斐波那契数列的并行计算;3. 编译程序,并添加OpenMP库支持;4. 运行程序,观察结果;5. 分析结果,对比串行计算和并行计算的性能。

并行程序实验报告

并行程序实验报告

并行程序实验报告( 一).并行程序的简介。

MPI(Message Passing Interface)是目前最重要的一种并行编程工具和环境,几乎所有重要的并行计算机厂商都提供对它的支持,MPI将功能、高效和移植性三个重要而又有一定矛盾的方面很好地融为一体,这是MPI能够取得成功的重要原因。

SIMD/MIMD并行计算机:指令和数据是计算机解决问题所涉及到的两个基本方面,即让计算机"执行什么"样的操作和对"什么对象"执行相应的操作,虽然现在计算机有了很大的发展,但他们仍然有重要的地位和作用,这也是为什么指令数据的划分方式至今仍在使用的重要原因。

不管是同时执行多条指令,还是同时处理多个数据,具有这样功能的计算机都可以称为并行计算机。

根据一个并行计算机能够同时执行的指令与处理数据的多少,可以把并行计算机分为SIMD (Single-Instruction Multiple-Data)单指令多数据并行计算机和MIMD(Multiple-Instruction Multiple-Data)多指令多数据并行计算机。

举例说明SIMD计算机的功能SIMD计算机同时用相同的指令对不同的数据进行操作,比如对于数组赋值运算A=A+1在SIMD并行机上可以用加法指令同时对数组A的所有元素实现加1。

即数组(或向量)运算特别适合在SIMD并行计算机上执行,SIMD并行机可以对这种运算形式进行直接地支持,高效地实现。

举例说明MIMD计算机的功能MIMD计算机同时有多条指令对不同的数据进行操作,比如对于算术表达式A=B+C+D-E+F*G可以转换为A=(B+C)+(D-E)+(F*G)加法(B+C),减法(D-E),乘法(F*G)如果有相应的直接执行部件,则这三个不同的计算可以同时进行。

SPMD/MPMD并行计算机SIMD和MIMD这种表达方法虽然至今还在广泛使用,但是,随着新的并行计算机组织方式的产生,比照上面的划分方法,人们按同时执行的程序和数据的不同,又提出了SPMD(Single-Program Multuple-Data)单程序多数据并行计算机和MPMD(Multiple-Program Multiple-Data)多程序多数据并行计算机的概念。

华科计算机并行实验报告

华科计算机并行实验报告

课程设计报告题目:并行实验报告课程名称:并行编程原理与实践专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录1,实验一 (1)1 实验目的与要求 (1)1.1实验目的 (1)1.2实验要求 (1)2 实验内容 (1)2.1.1熟悉pthread编程 (1)2.1.2简单的thread编程 (2)2.2.1熟悉openMP编程 (3)2.3.1熟悉MPI编程 (4)2,实验2~5 (7)1 实验目的与要求 (7)2 算法描述 (7)3.实验方案 (8)4实验结果与分析 (8)3 心得体会 (10)附录: (10)3 蒙特.卡罗算法求π的并行优化 (19)1.蒙特.卡罗算法基本思想 (19)2.工作过程 (20)3.算法描述 (20)4 设计与实现 (21)5 结果比较与分析 (23)6 思考与总结 (24)1,实验一1 实验目的与要求1.1实验目的1)熟悉并行开发环境,能进行简单程序的并行开发,在Linux下熟练操作。

2)熟悉一些并行工具,如pthread,OpenMP,MPI等进行并行编程3)培养并行编程的意识1.2实验要求1)利用pthread、OpenMP、MPI等工具,在Linux下进行简单的并行编程,并且掌握其编译、运行的方法。

2)理解并行计算的基础,理解pthread、OpenMP、MPI等并行方法。

2 实验内容2.1.1熟悉pthread编程Linux系统下的多线程遵循POSIX线程接口,称为 pthread。

编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。

下面是pthread编程的几个常用函数:1,int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);返回值:若是成功建立线程返回0,否则返回错误的编号形式参数:pthread_t *restrict tidp 要创建的线程的线程id指针const pthread_attr_t *restrict attr 创建线程时的线程属性void* (start_rtn)(void) 返回值是void类型的指针函数void *restrict arg start_rtn的行参2 , int pthread_join( pthread_t thread, void **retval );thread表示线程ID,与线程中的pid概念类似;retval用于存储等待线程的返回值连接函数pthread_join()是一种在线程间完成同步的方法。

并行计算实验报告一

并行计算实验报告一

并行计算实验报告一江苏科技大学计算机科学与工程学院实验报告评定成绩指导教师实验课程:并行计算宋英磊实验名称: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加锁。

并行计算实验

并行计算实验

实验(一)多线程计算π,性能分析一、实验内容及原理:通过多线程方法,用C 语言实现。

采用积分法,由如下公式求π:并通过双向比较,分析性能:1)计算量相同,线程数不同。

例如,N 取1000,000,测试使用1、2、3、4……个线程时所需要的时间。

2)线程数相同,计算量不同。

例如,只考察单线程和双线程的性能对比,N 分别取不同的数值。

二、程序流程图三、实验结果:(1)数据图表:N N i dx x N i 15.0141402102⨯⎪⎭⎫ ⎝⎛++≈+=∑⎰≤≤π1)计算量相同,线程数不同。

N=1000,000,thread_num=1,2,3,4,5性能对比。

0.010.020.030.040.050.060.070.08线程数1线程数2线程数3线程数4线程数52)线程数相同,计算量不同。

thread_num=2,N 取不同的数值。

0.050.10.150.20.250.3N=50000N=100000N=500000N=1000000N=5000000(2)效果图:1)计算量相同,线程数不同。

N=1000,000,thread_num=1,2,3,4,5性能对比。

2)线程数相同,计算量不同。

thread_num=2,N 取不同的数值。

四、理论性能分析首先,考虑单线程多个N的情况,随着N的加大,计算量加大,计算时间必然也会随着增加。

其次,考虑多线程固定N的情况,随着线程数增加,同时计算的数量在增加,计算时间必然会相应减少,但是会有一个极限值,不会随着线程数的增加而无限制的减少。

(值得注意的是,时间采用clock()计算精度不高。

)五、实验结果分析如上面截图所示,在单线程计算量不同的情况下,计算时间会随着计算量的增加而增加。

在多线程计算量相同的情况下,计算时间会相应减少。

六、总结展望对于大量的重复式计算,我们可以利用所学习的并行知识解决问题,尤其像这种可以进行域分解的算法,我们完全可以创建多线程来减少计算时间,提高效率,相信以后的学习和工作中,并行会给我们带来更多的方便。

并行计算与分布式系统实验报告

并行计算与分布式系统实验报告

并行计算与分布式系统实验报告1. 引言“彼岸花,开过就只剩残香。

”这是一句来自中国古代文学名篇《红楼梦》的名言。

它告诉我们,珍贵的事物往往难以长久保持,只有通过合理的分工与协作,才能实现最大的效益。

在计算机科学领域,这句话同样适用。

并行计算和分布式系统正是通过有效地利用计算资源,实现高效的数据处理与任务分工,从而提高计算效率和系统性能。

2. 并行计算介绍并行计算是一种利用多个处理器或计算节点同时执行计算任务的方法。

它通过将大型计算问题划分为多个小的子问题,并同时解决这些子问题,大幅提高计算速度。

并行计算有两种主要的形式:数据并行和任务并行。

数据并行将大型数据集分割成多个小块,分别交给不同的处理器进行处理;任务并行将不同的任务分配到不同的处理器上同时执行。

3. 分布式系统介绍分布式系统是一组互连的计算机节点,通过网络相互协作以实现共同的目标。

分布式系统可以分布在不同地理位置的计算机上,通过消息传递和远程过程调用等通信机制实现节点间的协作。

分布式系统具有高可靠性、可扩展性和容错性的特点,并广泛应用于云计算、大数据处理和分布式存储等领域。

4. 并行计算和分布式系统的关系并行计算和分布式系统之间存在密切的关系。

分布式系统提供了并行计算所需的底层基础设施和通信机制,而并行计算则借助分布式系统的支持,实现任务的并行处理和数据的高效交换。

通过充分利用分布式系统中的计算资源,可以实现更高效的并行计算,并加速大规模数据处理和科学计算。

5. 并行计算与分布式系统实验在完成本次实验中,我们使用了一台集群式分布式系统,包括8台计算节点和1台主控节点。

我们利用MPI(Message Passing Interface)实现了一个并行计算的案例,该案例通过并行处理大规模图像数据,实现图像的快速处理和分析。

实验中,我们首先将图像数据划分成多个小块,并分发给不同的计算节点进行处理。

每个计算节点利用并行算法对图像进行滤波和边缘检测,然后将处理结果返回给主控节点。

并行程序设计实验报告

并行程序设计实验报告

并行程序设计实验报告实验报告:并行程序设计一、实验目的本实验旨在通过并行程序设计,提高程序的执行效率和性能,减少串行程序在处理大规模数据时出现的效率瓶颈。

二、实验原理1.任务划分:将大规模的任务划分成多个可并行执行的子任务。

2.任务分配:将各个子任务分配给不同的计算单元(如多线程、多进程、多核)进行处理。

3.任务合并:将各个子任务的计算结果进行合并,得到最终的结果。

三、实验内容本次实验主要涉及多线程编程和数据并行编程。

1.多线程编程多线程编程是指在一个单独的程序中同时运行多个线程,利用系统的多核资源来提高程序的执行效率。

多线程编程可以通过线程的创建、启动、运行和同步等操作来实现。

在本实验中,我们将使用C++编程语言,并利用其提供的多线程库来实现多线程编程。

具体步骤如下:(1)使用pthread库创建并启动多个线程。

(2)利用线程同步机制(如互斥锁、信号量等)保证线程的正确执行顺序和数据的正确性。

(3)通过编写并行程序,将大规模任务划分成多个子任务,并分配给不同的线程进行处理。

2.数据并行编程数据并行编程是指将大规模的数据划分成多个小块,并分配给多个计算单元(如GPU)进行并行处理。

每个计算单元都执行相同的计算操作,但操作的数据不同。

在本实验中,我们将使用CUDA平台进行数据并行编程。

(1)利用CUDA编程模型,将计算任务划分成多个线程块,并分配给不同的计算单元执行。

(2)通过编写并行程序,实现数据的划分和映射、任务的分配和协调。

四、实验结果经过多次实验,我们发现并行程序设计在处理大规模数据时能够显著提高程序的执行效率和性能。

相比于串行程序,多线程编程和数据并行编程分别提高了X%和Y%的执行速度。

同时,我们也发现在设计并行程序时,要考虑到数据的划分和映射、任务的分配和协调、线程的同步和通信等方面的问题。

这些问题对于程序的性能和正确性都有着重要的影响。

五、实验总结通过本次实验,我们了解到并行程序设计的基本原理和技术,以及它在优化程序性能和提高执行效率方面的重要作用。

并行计算实训课程学习总结并行程序设计与性能优化

并行计算实训课程学习总结并行程序设计与性能优化

并行计算实训课程学习总结并行程序设计与性能优化并行计算实训课程学习总结:并行程序设计与性能优化在本学期的并行计算实训课程中,我学习了并行程序设计与性能优化的基本概念和技巧。

通过课程的学习,我对并行计算的原理和应用有了更深入的了解,并且掌握了一些重要的并行编程工具和技术。

本文将对我在课程学习中所获得的收获和体会进行总结。

一、并行计算基础知识的学习在课程的初期,我们首先系统地学习了并行计算的基础知识。

我们了解了并行计算的定义和特点,并且学习了一些常用的并行计算模型和编程范式,如共享内存和分布式内存,并行编程的基本概念等。

通过这些学习,我对并行计算的概念和原理有了更加清晰的认识,并且了解到了并行计算在大规模数据处理和科学计算领域的重要性。

二、并行程序设计的实践在掌握了并行计算的基础知识后,我们进行了一系列的并行程序设计实践。

我们采用了不同的并行编程模型和工具,如OpenMP和MPI,并编写了一些简单的并行程序。

通过实践,我学会了如何在程序中进行任务划分和数据划分,并且掌握了一些常用的并行编程技巧,如粒度调整、负载平衡等。

这些实践帮助我更好地理解了并行程序设计的思想和方法,并且提高了我的编程能力。

三、性能优化的策略与技术在实践的基础上,我们进一步学习了性能优化的策略与技术。

我们了解了一些常见的性能瓶颈,如数据传输、负载不平衡等,并学习了一些性能优化的方法和工具,如并行算法设计、并行调试和性能分析工具等。

通过对这些策略和技术的学习,我学会了如何在编程过程中尽可能地提高程序的并行性和性能,并且提高了我的问题分析和解决能力。

综上所述,通过本学期的并行计算实训课程,我不仅学会了并行程序设计与性能优化的基本理论和技术,还提高了我的实践能力和问题解决能力。

这门课程对我今后的学习和研究具有重要的指导意义。

我将继续努力学习,并将所学知识应用到实际项目中,为实现高效的并行计算做出贡献。

注:本文仅为参考范文,具体内容需要根据实际情况和要求进行修改和补充。

并行计算实验一报告

并行计算实验一报告

并行计算实验一报告广东技术师范学院实验报告计算机科学与学院: 计算机科学学院专业: 班级: 成绩: 技术姓名: 学号: 组别: 组员: 实验地点: 工业中心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”首先会提示输入用户账号,然后会提示输入两边密码,之后会问你是否保持上面的设定。

并行计算实验报告(高性能计算与网格技术)

并行计算实验报告(高性能计算与网格技术)

并行计算实验报告(高性能计算与网格技术)高性能计算和网格技术实验报告实验题目OpenMP和MPI编程姓名学号专业计算机系统结构指导教师助教所在学院计算机科学与工程学院论文提交日期一、实验目的本实验的目的是通过练习掌握OpenMP 和MPI 并行编程的知识和技巧。

1、熟悉OpenMP 和MPI 编程环境和工具的使用;2、掌握并行程序编写的基本步骤;3、了解并行程序调试和调优的技巧。

二、实验要求1、独立完成实验内容;2、了解并行算法的设计基础;3、熟悉OpenMP和MPI的编程环境以及运行环境;4、理解不同线程数,进程数对于加速比的影响。

三、实验内容3.1、矩阵LU分解算法的设计:参考文档sy6.doc所使用的并行算法:在LU分解的过程中,主要的计算是利用主行i对其余各行j,(j>i)作初等行变换,各行计算之间没有数据相关关系,因此可以对矩阵A 按行划分来实现并行计算。

考虑到在计算过程中处理器之间的负载均衡,对A采用行交叉划分:设处理器个数为p,矩阵A的阶数为n,??p=,对矩阵A行交叉划分后,编号为i(i=0,1,…,p-1)的处理器存有m/nA的第i, i+p,…, i+(m-1)p行。

然后依次以第0,1,…,n-1行作为主行,将其广播给所有处理器,各处理器利用主行对其部分行向量做行变换,这实际上是各处理器轮流选出主行并广播。

若以编号为my_rank 的处理器的第i行元素作为主行,并将它广播给所有处理器,则编号大于等于my_rank的处理器利用主行元素对其第i+1,…,m-1行数据做行变换,其它处理器利用主行元素对其第i,…,m-1行数据做行变换。

根据上述算法原理用代码表示如下(关键代码):for(k = 0;k<n;k++)< p="">{for (i = 0; i < THREADS_NUM; i++) {thread_data_arrray[i].thread_id = i;thread_data_arrray[i].K_number = k;thread_data_arrray[i].chushu = a[k][k];//创建线程rc = pthread_create(&pid[i], NULL, work,(void*)&thread_data_arrray[i]);…}for (i = 0; i < THREADS_NUM; i++){//等待线程同步rc = pthread_join(pid[i], &ret); …}}void *work(void *arg){struct thread_data *my_data;my_data = (struct thread_data*)arg;int myid = my_data->thread_id; //线程IDint myk = my_data->K_number; //外层循环计数Kfloat mychushu = my_data->chushu; //对角线的值int s, e;int i, j;s = (N-myk-1) * myid / THREADS_NUM; //确定起始循环的行数的相对位置e = (N-myk-1) * (myid + 1) / THREADS_NUM;//确定终止循环的行数的相对位置for (i = s+myk+1; i < e+myk+1; i++) //由于矩阵规模在缩小,找到偏移位置 { a[i][myk]=a[i][myk]/mychushu; for (j = myk+1; j < N; j++) a[i][j]=a[i][j]-a[i][myk]*a[myk][j]; }//printMatrix(a); return NULL;}第一部分为入口函数,其创建指定的线程数,并根据不同的线程id 按行划分矩阵,将矩阵的不同部分作为参数传递给线程,在多处理器电脑上,不同的线程并行执行,实现并行计算LU 分解。

并行计算实验报告

并行计算实验报告

分析 :这样的加速比 , 是符合预测 , 很好的 . 附 :(实验 源码 ) 1 pi.cpp #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <ctime> #include <cassert>
#include <climits> #include <iostream> #include <iomanip> #include <string> #include <vector> #include <set> #include <map> #include <queue> #include <deque> #include <bitset> #include <algorithm> #include <omp.h> #define MST(a, b) memset(a, b, sizeof(a)) #define REP(i, a) for (int i = 0; i < int(a); i++) #define REPP(i, a, b) for (int i = int(a); i <= int(b); i++) #define NUM_THREADS 4 using namespace std; const int N = 1e6; double sum[N]; int main() { ios :: sync_with_stdio(0); clock_t st, ed; double pi = 0, x; //串行 st = clock(); double step = 1.0 / N; REP(i, N) { x = (i + 0.5) * step; pi += 4.0 / (1.0 + x * x); } pi /= N; ed = clock(); cout << fixed << setprecision(10) << "Pi: " << pi << endl; cout << fixed << setprecision(10) << "串行用时: " << 1.0 * (ed - st) / CLOCKS_PER_SEC << endl; //并行域并行化 pi = 0; omp_set_num_threads(NUM_THREADS); st = clock(); int i; #pragma omp parallel private(i) { double x; int id; id = omp_get_thread_num();

OpenMP并行实验报告

OpenMP并行实验报告

并行实验报告一、积分计算圆周率1.1积分计算圆周率的向量优化1.1.1串行版本的设计任务:理解积分求圆周率的方法,将其用C代码实现。

、、亠理论上,dx越小,求得的圆周率越准确;在计算机中由于表"示的数据是有精度范围的,如果dx太小,积分次数过多,误差积累导致结果不准确。

以下为串行代码:#in clude<stdio.h>#in clude<time.h> #defi ne N 10000000 double get_pi (int dt){double pi=0.0;double delta =1.0/dt; int i;for(i=0; i<dt; i++){ double x=(double)i/dt; pi+=delta/(1.0+x*x);}retur n pi*4;} int mai n(){int dx;double pai;double start,fi ni sh;dx=N;start二clock();pai二get_pi(dx);fini sh=clock();prin tf("%.8lf\n",pai);prin tf("%.8lfS\n",(double)(fi ni sh-start)/CLOCKS_PER_SEC); retur n 0; }第一次:time=0.02674000S第二次:time=0.02446500S第三次:time=0.02402800S三次平均为:0.02508S1.1.2 SSE向量优化版本设计任务:此部分需要给出单精度和双精度两个优化版本(1)测试均在划分度为10的7次方下完成。

以下是SSE双精度的代码:#i nclude<stdio.h>#in clude<x86 intrin.h>#in clude<time.h>#defi ne N 10000000 double get_pi (int dt){double pi=0.0;double delta =1.0/dt; int i;for(i=0; i<dt; i++){ double x=(double)i/dt; pi+=delta/(1.0+x*x);}return pi*4;} double get_pi_sse(size_t dt){double pi=0.0;double delta =1.0/dt;__m128d xmm0,xmm1,xmm2,xmm3,xmm4; xmm0=_mm_set1_pd(1.0);xmm1=_mm_set1_pd(delta);xmm2=_mm_set_pd(delta,0.0); xmm4=_mm_setzero_pd();for(long int i=0; i<=dt-2; i+=2){xmm3= _mm_set1_pd((double)i*delta);xmm3= _mm_add_pd(xmm3,xmm2);xmm3= _mm_mul_pd(xmm3,xmm3);xmm3= _mm_add_pd(xmm0,xmm3);xmm3= _mm_div_pd(xmm1,xmm3);xmm4= _mm_add_pd(xmm4,xmm3);} --double tmp[2] __attribute__((alig ned(16))); _mm_store_pd(tmp,xmm4); pi+=tmp[0]+tmp[1]/*+tmp[2]+tmp[3]*/;return pi*4.0; } int main(){int dx;double pai;double start,fi ni sh; dx=N;start=clock(); pai=get_pi_sse(dx);fini sh=clock();prin tf("%.8lf\n",pai);prin tf("%.8lfS\n",(double)((fi nish-start)/CLOCKS_PER_SEC)); return 0; }时间运行如下:第一次:time=0.00837500S第二次:time=0.00741100S第三次:time=0.00772000S三次平均为:0.00783S以下是SSE单精度的代码:#i nclude<stdio.h>#in clude<x86 intrin.h>#in clude<time.h>#defi ne N 10000000float get_pi_sse(size_t dt){float pi=0.0;float delta =1.0/dt;__m128 xmm0,xmm1,xmm2,xmm3,xmm4; xmm0=_mm_set1_ps(1.0);xmm1=_mm_set1_ps(delta);xmm2=_mm_set_ps(delta*3,delta*2,delta,0.0); xmm4=_mm_setzero_ps();for(l ong int i=0; i<=dt-4; i+=4){xmm3= _mm_set1_ps((float)i*delta);xmm3= _mm_add_ps(xmm3,xmm2);xmm3= _mm_mul_ps(xmm3,xmm3);xmm3= _mm_add_ps(xmm0,xmm3);xmm3= _mm_div_ps(xmm1,xmm3);xmm4= _mm_add_ps(xmm4,xmm3);} --float tmp[4] __attribute__((al ig ned(16)));_mm_store_ps(tmp,xmm4);pi+=tmp[0]+tmp[1]+tmp[2]+tmp[3];return pi*4.0;}int main(){int dx;float pai;double start,fi ni sh;dx=N;start=clock();pai=get_pi_sse(dx);fini sh=clock();prin tf("%.8f\n",pai);prin tf("%.8lfS\n",(double)((fi nish-start)/CLOCKS_PER_SEC)); return 0; }时间运行如下:第一次:time=0.00406100S第二次:time=0.00426400S第三次:time=0.00437600S三次平均为:0.00423S1.1.3 AVX向量优化版本设计任务:此部分需要给出单精度和双精度两个优化版本注意:(1)测试均在划分度为10的7次方下完成。

并行计算实验报告

并行计算实验报告

学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级并行计算理学院余新华罗云信计1202班2014 2015学年第2 学期2、开机瞬间按F2,设定BIOS 从CD-ROM 启动系统。

保存设置后重启,则开机自动加载镜像。

班级 信计1202日期 2014.06.09 成绩评定姓名 rm —"罗云 实验室 数学207 老师签名学号 0121214410203实验 名称 所用软件 Linux 的安装与使用入门VMware workstati on实 验 目 的 及 内 容1、在虚拟机上实践Linux 系统的安装2、掌握linux 命令的使用入门linux 系统的安装1、 首先,下载一份CentOS 6.5的系统镜像文件,装进虚拟机的虚拟光驱。

赃■轴2 GB4 a 话疙汨 ZD GftCEm/DvD l :E£j正在便闺交件D :!3S^£^料由宮…T=^iM!E雅B 卡w±存阳旬盹蟲SIP :3、进入CentOS系统引导设置界面,语言、时区、网卡等使用默认选项。

调整分区时为linux系统分配/boot、/root、/home 禾口swap块,/boot 为弓I导区分配200MB左右即可,其他区块大小应根据需要事先规划好,如果分配的不合理也可以进入系统后使用fdisk命令进行调整。

Please Select A Qevlce11«K t^toLTC POiKi 1WEWkinwFflfTTHlIv 诃OKWp 旳 Et«wnIvnnC 139% 1mcE4 z■¥_WMP -Miap虬JKTfl 电Jwn»✓* Hurd Olvea*d«x w jbvazM97» v^stejcrptiy^ [屈 .Jrt*/R<5tf串kb系统安装形式选择Basic Serve ,以服务器的形式安 装即可。

并行计算实验报告

并行计算实验报告

并行计算实验报告并行计算实验报告引言:并行计算是一种有效提高计算机性能的技术,它通过同时执行多个计算任务来加速计算过程。

在本次实验中,我们将探索并行计算的原理和应用,并通过实验验证其效果。

一、并行计算的原理并行计算是指将一个计算任务分成多个子任务,并通过多个处理器同时执行这些子任务,以提高计算速度。

其原理基于两个关键概念:任务划分和任务调度。

1. 任务划分任务划分是将一个大的计算任务划分成多个小的子任务的过程。

划分的目标是使得每个子任务的计算量尽可能均衡,并且可以并行执行。

常见的任务划分方法有数据划分和功能划分两种。

- 数据划分:将数据分成多个部分,每个处理器负责处理其中一部分数据。

这种划分适用于数据密集型的计算任务,如图像处理和大规模数据分析。

- 功能划分:将计算任务按照功能划分成多个子任务,每个处理器负责执行其中一个子任务。

这种划分适用于计算密集型的任务,如矩阵运算和模拟仿真。

2. 任务调度任务调度是将划分后的子任务分配给不同的处理器,并协调它们的执行顺序和通信。

任务调度的目标是最大程度地减少处理器之间的等待时间和通信开销,以提高整体计算效率。

二、并行计算的应用并行计算广泛应用于科学计算、大数据处理、人工智能等领域。

它可以加速计算过程,提高计算机系统的性能,并解决一些传统计算方法难以处理的问题。

1. 科学计算并行计算在科学计算中起到至关重要的作用。

例如,在天气预报模型中,通过将地球划分成多个网格,每个处理器负责计算其中一个网格的气象数据,可以加快模型的计算速度,提高预报准确性。

2. 大数据处理随着大数据时代的到来,传统的串行计算方法已经无法满足大规模数据的处理需求。

并行计算可以将大数据分成多个部分,通过多个处理器同时处理,提高数据的处理速度。

例如,谷歌的分布式文件系统和MapReduce框架就是基于并行计算的思想。

3. 人工智能人工智能算法通常需要大量的计算资源来进行模型训练和推理。

并行计算可以在多个处理器上同时执行算法的计算任务,加快模型的训练和推理速度。

并行计算实验报告

并行计算实验报告

并行计算实验报告《并行计算实验报告》摘要:本实验报告旨在介绍并行计算的基本概念和原理,并通过实验结果展示并行计算在提高计算效率和性能方面的优势。

实验采用了不同的并行计算技术和工具,并对比了串行计算和并行计算的性能表现,以验证并行计算在处理大规模数据和复杂计算任务时的优越性。

1. 引言并行计算是一种利用多个处理器或计算节点同时进行计算任务的技术。

它可以显著提高计算效率和性能,特别是在处理大规模数据和复杂计算任务时。

本实验报告将通过一系列实验来展示并行计算的优势和应用场景。

2. 实验设计本次实验采用了多种并行计算技术和工具,包括MPI(Message Passing Interface)、OpenMP和CUDA。

实验分为两个部分:第一部分是对比串行计算和并行计算的性能表现,第二部分是针对特定应用场景的并行计算实验。

3. 实验结果在第一部分实验中,我们对比了串行计算和MPI并行计算的性能表现。

实验结果显示,随着计算规模的增加,MPI并行计算的性能优势逐渐显现,尤其在处理大规模数据时表现更为明显。

而在第二部分实验中,我们针对图像处理任务使用了OpenMP和CUDA进行并行计算,实验结果显示,这两种并行计算技术都能够显著提高图像处理的速度和效率。

4. 结论通过实验结果的对比和分析,我们可以得出结论:并行计算在处理大规模数据和复杂计算任务时具有明显的优势,能够显著提高计算效率和性能。

不同的并行计算技术和工具适用于不同的应用场景,选择合适的并行计算方案可以最大程度地发挥计算资源的潜力。

5. 展望未来,随着计算资源的不断增加和并行计算技术的不断发展,我们相信并行计算将在更多领域得到应用,为我们解决更多复杂的计算问题提供强大的支持和帮助。

综上所述,本实验报告通过实验结果展示了并行计算在提高计算效率和性能方面的优势,为并行计算技术的应用和发展提供了有力的支持和验证。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

并行计算上机实验报告题目:多线程计算Pi值
学生姓名
学院名称计算机学院
专业计算机科学与技术时间
一. 实验目的
1、掌握集群任务提交方式;
2、掌握多线程编程。

二.实验内容
1、通过下图中的近似公式,使用多线程编程实现pi的计算;
2、通过控制变量N的数值以及线程的数量,观察程序的执行效率。

三.实现方法
1. 下载配置SSH客户端
2. 用多线程编写pi代码
3. 通过文件传输界面,将文件上传到集群上
4.将命令行目录切换至data,对.c文件进行编译
5.编写PBS脚本,提交作业
6.实验代码如下:
#include <math.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
static double PI=0;
static int N=0;
static int numOfThread=0;
static int length=0;
static int timeUsed=0;
static int numOfThreadArray[]={1,2,4,6,8,10,12,14,16,20,24,30};
static int threadArraySize=12;
static int nTime=4;
static int repeatTime=30;
static double totalTime=0;
struct timeval tvpre, tvafter;
pthread_mutex_t mut;
clockid_t startTime,endTime;
void cmpu(int i)
{
double p=0;
int k;
for(k=i*length;k<(i+1)*length;k++)
{
p+=4.0/((double)(1+(pow((k+0.5)/N,2 )))); }
p=p/N;
pthread_mutex_lock(&mut);
PI+=p;
pthread_mutex_unlock(&mut);
}
void mu()
{
gettimeofday(&tvpre, NULL);
startTime=clock();
pthread_t *myThread;
myThread=(pthread_t*)malloc((sizeof(pthread_t)*numOfThread) );
int i;
int res;
for(i=0;i<numOfThread;i++)
{
res=pthread_create(&myThread[i],NULL,cmpu,i);
if(res!=0)
{
perror("Thread join failed");
}
}
for(i=0;i<numOfThread;i++)
{
pthread_join(myThread[i],NULL);
}
int left;
for(left=(length*numOfThread);left<N;left++){
PI+=4.0/((double)(1+(pow((left+0.5)/N,2 ))))/N;
}
endTime=clock();
timeUsed=endTime-startTime;
gettimeofday(&tvafter, NULL);
}
void printResult()
{
printf("N is %d , num of threads is %d\n",N,numOfThread); printf("Pi is %0.15f \n Used time %d ms\n",PI,(timeUsed)); printf("cost time: %ld msecond\n", (__sec)*1000+(_usec-tvpre.t v_usec)/1000);
}
void mainPro(int ns,int n_thread,FILE *fp)
{
N=ns;
numOfThread=n_thread;
PI=0;
length=N/numOfThread;
mu();
}
void main(int arg,char **args)
{
N=100000;
FILE *fp=fopen("myLog.xls","a");
int i=0;
for(i=0;i<nTime;i++)
{
N=N*10;
int j=0;
for(j=0;j<threadArraySize;j++)
{
numOfThread=numOfThreadArray[j];
totalTime=0;
int q=0;
for(q=0;q<repeatTime;q++)
{
mainPro(N,numOfThread,fp);
totalTime+=(__sec)*1000+(tvafter.t v__usec)/1000;
}
fprintf(fp,"%d,%d,%f\n",N,numOfThread,totalTime/repeatTi me);
printf("%d,%d,%f\n",N,numOfThread,totalTime/repeatTime);
}
}
fclose(fp);
}
四.程序流程图
五.加速比曲线
1.下图为线程数与运行时间的关系,横坐标代表线程数,纵坐标代
表运行时间,黄色的曲线代表N=100000000,粉色的曲线代表N=1000000,黑色的线代表N=100000.
2.加速比曲线
100000000
10000000
1000000
六.总结感悟
随着运算线程增加,运算量一定情况下,运算时间减少。

这符合加速比定律。

此程序不需要线程间通信,而内存占用等因素集群又可满足,所以基本上加速比和线程数是成正比的。

通过此次实验,我学会了如何在集群上提交任务,如何查看任务情况等,了解并行程序和串行程序的差别,在课堂上学到的理论知识通过实践可以更深刻更透彻的理解,通过实验我收获很多。

相关文档
最新文档