里仁多核程序设计实验报告.docx

上传人:scccc 文档编号:12699757 上传时间:2021-12-05 格式:DOCX 页数:13 大小:323.07KB
返回 下载 相关 举报
里仁多核程序设计实验报告.docx_第1页
第1页 / 共13页
里仁多核程序设计实验报告.docx_第2页
第2页 / 共13页
里仁多核程序设计实验报告.docx_第3页
第3页 / 共13页
里仁多核程序设计实验报告.docx_第4页
第4页 / 共13页
里仁多核程序设计实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《里仁多核程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《里仁多核程序设计实验报告.docx(13页珍藏版)》请在三一文库上搜索。

1、. 多核程序设计实验报告Multi-core Programming Experiment Report学生所在学院: 里仁学院 学生所在班级: 学 生 姓 名 : 学 生 学 号 : 指 导 教 师 : 教 务 处2014年 4 月;实验一 Windows多线程编程模块一:基础练习 一. 实验目的与要求二. 实验环境及软件三. 实验内容四. 实验代码· #include <stdio.h>  · #include <time.h>  · #include <std

2、lib.h>  · #include <omp.h>     · void test(int n)  ·   ·     for (int i = 0; i< 10000; i+)    ·     

3、60; ·   · int main()    ·     double dResult;  ·     long lBefore = clock();  · #pragma omp parallel for  ·    

4、; for (int i = 0; i < 10000; i+)  ·         test(i);  ·     dResult = (double)(clock() - lBefore);  ·     p

5、rintf("nTotal Time: %f ms.n", dResult);  ·     system("pause");  ·     return 0;  ·  五. 结果分析运行时间是串行的一半。明显降低了时间的消耗。实验二 各种同步机制的性能比较一. 实验目的与要求二. 实验环境及软件三. 实验内容以矩阵乘进行并行串

6、行比较四. 实验代码和结果实验代码:/ juzhencheng.cpp : 定义控制台应用程序的入口点。#include "stdafx.h" #include <omp.h> #include <stdio.h> #include <time.h> #define NN 2000 int ANNNN, BNNNN;long long CNNNN;void solve(int n, int num_thread)int i, j, t, k, paralleltime, serialtime;clock_t startTime, endT

7、ime;long long sum;omp_set_num_threads(num_thread);/-对矩阵A和矩阵B进行初始化- for (i = 0; i<n; i+)t = i + 1;for (j = 0; j<n; j+)Aij = t+;Bij = 1;/-矩阵乘法并行算法- startTime = clock();sum = 0;#pragma omp parallel shared(A,B,C) private(i,j,k) #pragma omp for schedule(dynamic) for (i = 0; i<n; i+)for (j = 0; j

8、<n; j+)Cij = 0;for (k = 0; k<n; k+)Cij += Aik * Bkj;for (i = 0; i<n; i+)for (j = 0; j<n; j+)sum += Cij;endTime = clock();paralleltime = endTime - startTime;printf("矩阵C所有元素和为sum=%lld 并行计算时间time=%dmsn", sum, paralleltime); startTime = clock();sum = 0;for (i = 0; i<n; i+)for (j

9、 = 0; j<n; j+)Cij = 0;for (k = 0; k<n; k+)Cij += Aik * Bkj;for (i = 0; i<n; i+)for (j = 0; j<n; j+)sum += Cij;endTime = clock();serialtime = endTime - startTime;printf("矩阵C所有元素和为sum=%lld 串行计算时间time=%dmsn", sum, serialtime);printf("相对加速比为: %d/%dn", serialtime, parallel

10、time);int _tmain(int argc, _TCHAR* argv)int n, num_thread;printf("请输入矩阵的节数(整数N<=2000),再输入并行的线程数。nn");while (scanf("%d%d", &n, &num_thread) != EOF)printf("你输入的矩阵节数为:%d并行线程数为:%dn", n, num_thread);solve(n, num_thread);return 0;实验结果:实验三 蒙特卡洛法并行求解Pi值一. 实验目的与要求二. 实

11、验环境及软件三. 实验内容四. 实验代码和结果代码:/ Pi.cpp : 定义控制台应用程序的入口点。 /求圆周率PI #include "stdafx.h" #include <windows.h> #include <time.h> #include <omp.h> #include <iostream> using namespace std; static long num_steps=1000000000;/定义所分的块数 #define NUM_THREADS 2 /定义所开启的线程数 int _tmain(int

12、 argc, _TCHAR* argv) int i; omp_set_num_threads(NUM_THREADS);/开启线程 double x,sum=0.0,pi; clock_t start_time,end_time; double step=1.0/(double)num_steps; /并行- start_time=clock(); #pragma omp parallel sections reduction(+:sum) private(x,i) #pragma omp section for (i=omp_get_thread_num();i<num_steps;

13、i=i+NUM_THREADS) x=(i+0.5)*step; sum=sum+4.0/(1.0+x*x); #pragma omp section for (i=omp_get_thread_num();i<num_steps;i=i+NUM_THREADS) x=(i+0.5)*step; sum=sum+4.0/(1.0+x*x); pi=step*sum; end_time=clock(); cout<<"Pi="<<pi<<endl; cout<<"并行time="<<end_

14、time-start_time<<endl; /串行- sum=0.0; start_time=clock(); for (i=0;i<num_steps;i+) x=(i+0.5)*step; sum=sum+4.0/(1.0+x*x); pi=step*sum; end_time=clock(); cout<<"Pi="<<pi<<endl; cout<<"串行time="<<end_time-start_time<<endl; system("pau

15、se"); return 0; 结果:实验四 多核并行排序实验一. 实验目的与要求1、熟悉快速排序的串行算法2、熟悉快速排序的并行算法 3、实现快速排序的并行算法 二. 实验环境及软件硬件环境:。,OS:,软件工具:VC三. 实验内容1、快速排序的基本思想2、快速排序算法的性能3、快速排序算法并行化四. 实验代码和结果实验代码:/ bingxingpaixu.cpp : 定义控制台应用程序的入口点。#include "stdafx.h" #include <stdio.h> #include<iostream> #include <s

16、tdlib.h> #include <time.h> #include "omp.h" using namespace std;/int count=0; void swap(int &a, int &b)/ int tmp;tmp = a;a = b;b = tmp;void quicksort(int *A, int l, int u)int i, m, k;if (l >= u) return;m = l;for (i = l + 1; i <= u; i+)if (Ai < Al)/*不管是选第一个元素作为pivo

17、t还是最后一个作为pivot,假如我们想得到的是从小到大的序列,那么最坏的输入情况就是从大到小的;如果我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/swap(A+m, Ai);swap(Al, Am);quicksort(A, l, m - 1);quicksort(A, m + 1, u);void main(int argc, char *argv)omp_set_num_threads(2);/-设置线程数为2,因为是双核的CPU int k = 0, i = 0;int m = 0, n = 0;double cost = 0;int len = 10000;int

18、 short_len = len / 2;int B10000, C10000, D5000, E5000;/-将B分为两个小的数组,并行的对他们调用快速排序算法 #pragma omp parallel default(none) shared(B,C,len) private(i)/-这个for循环是并行的 int j = 50000;#pragma omp for for (i = 0; i<len; i+)Bi = j-;Ci = j-;/初始化B,C数组 clock_t begin = clock();/-计时开始点 #pragma omp parallel default(n

19、one) shared(B,D,E,short_len) private(i)/-这个for循环是并行的 #pragma omp for for (i = 0; i<short_len; i+)/-这个for循环是并行的 Di = Bi;/将B的前5000个数放入D Ei = Bi + 5000;/将B的后5000个数放入E #pragma omp parallel default(none) shared(E,D,short_len) /private(i)-快速排序的并行region #pragma omp parallel sections #pragma omp section

20、quicksort(D, 0, short_len - 1);/对D排序 #pragma omp section quicksort(E, 0, short_len - 1);/对E排序 for (; k<len; k+)/-将D和E进行归并排序放入B里面 if (m<short_len && n<short_len)if (Dn <= Em)Bk = Dn;n+;elseBk = Em;m+;if (m = short_len | n = short_len)if (m = short_len)Bk = Em;elseBk = Dn - 1;k +=

21、1;break;if (/*m=short_len &&*/ n<short_len)int tem = short_len - n;for (int p = 0; p<tem; p+)Bk = Dn;n+;k+;else if (/*n=short_len &&*/ m<short_len)int tem = short_len - m;for (int q = 0; q<tem; q+)Bk = Em;m+;k+;/-归并算法结束 clock_t end = clock();/-计时结束点 cost = (double)(end -

22、begin);cout << "并行时间" << cost << endl;/串行开始 begin = clock();quicksort(C, 0, len - 1);end = clock();cost = (double)(end - begin);cout << "串行时间" << cost << endl;system("pause");实验结果:封面设计: 贾丽地 址:中国河北省秦皇岛市河北大街438号邮 编:066004电 话:0335-8057068传 真:0335-8057068网 址:- 10 -

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1