里仁多核程序设计实验报告_第1页
里仁多核程序设计实验报告_第2页
里仁多核程序设计实验报告_第3页
里仁多核程序设计实验报告_第4页
里仁多核程序设计实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Multi-core Programming Experiment Report多核程序设计实验报告学生所在学院:学生所在班级:2014年4月实验一 Windows多线程编程模块一:基础练习1 .实验目的与要求2 .实验环境及软件3 .实验内容4 .实验代码#include <stdio.h>#include <time.h>#include <stdlib.h>#include <omp.h>void test(int n)for (int i = 0; i< 10000; i+) int main() double dResult;lo

2、ng lBefore = clock();#pragma omp parallel forfor (int i = 0; i < 10000; i+) test(i);dResult = (double)(clock() - lBefore);printf("nTotal Time: %f ms.n", dResult);system("pause");return 0;5 .结果分析-1 -运行时间是串行的一半。明显降低了时间的消耗。实验二 各种同步机制的性能比较一 . 实验目的与要求二 . 实验环境及软件三 . 实验内容以矩阵乘进行并行串行比较

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

4、g 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<n; j+

5、)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;- 3 -for (i = 0; i<n; i+

6、)for (j = 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=%11d 串行计算时间time=%dmsn", sum, serialtime);printf("相对加速比为:%d/%dn", serialtim

7、e, paralleltime);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;实验结果:请输入矩阵的节数(整数*=如四)

8、,用输入并行的线程数。错审入毋I醉节蚣上士电腼吊丁线程蚊视10_time-4212ns t ime -8 704r>c甲匡C所有兀耋和为g叫皿并计/日间 如阵C所有元素和为酶串行计昇时H 相对加速L匕为: 8704Z4Z12实验三蒙特卡洛法并行求解Pi值 一 . 实验目的与要求二 . 实验环境及软件三 . 实验内容四 . 实验代码和结果代码:/ Pi.cpp : 定义控制台应用程序的入口点。/求圆周率PI#include "stdafx.h"#include <windows.h>#include <time.h>#include <om

9、p.h>#include <iostream>using namespace std;static long num_steps=1000000000;/ 定义所分的块数#define NUM_THREADS 2 / 定义所开启的线程数int _tmain(int 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_t

10、ime=clock();#pragma omp parallel sections reduction(+:sum) private(x,i)#pragma omp sectionfor (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);#pragma omp sectionfor (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

11、);pi=step*sum;end_time=clock();cout<<"Pi="<<pi<<endl;cout<<"并行 time="<<end_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=&quo

12、t;<<pi<<endl;cout<<"串行 time="<<end_time-start_time<<endl;system("pause");return 0;亨丰彳丁 L ±iit± 45。&彳T r -l ER号i育4表在盍.彘-结果:实验四多核并行排序实验.实验目的与要求1、熟悉快速排序的串行算法2、熟悉快速排序的并行算法3、实现快速排序的并行算法二 . 实验环境及软件硬件环境:。 。 。 , OS: ,软件工具:VC三 . 实验内容1、快速排序的基本思想2

13、、快速排序算法的性能3、快速排序算法并行化四 . 实验代码和结果 实验代码:/ bingxingpaixu.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <stdio.h>#include<iostream>#include <stdlib.h>#include <time.h>#include "omp.h" using namespace std;/int count=0;void swap(int &a, int &b)/int tmp

14、;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+)- 7 -if (Ai < Al)/*不管是选第一个元素作为pivot还是最后一个作为pivot,假如我们想得到的是从小到大的序列,那么最坏的输入情况就是从大到小的;如果我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/swap(A+m, Ai);swap(Al, Am);quicksort(A, l, m - 1);

15、quicksort(A, m + 1, u);void main(int argc, char *argv)omp_set_num_threads(2);/ 设置线程数为2,因为是双核的CPUint k = 0, i = 0;int m = 0, n = 0;double cost = 0;int len = 10000;int short_len = len / 2;int B10000, C10000, D5000, E5000;/ 将 B口 分为两个小的数组,并行的对他们调用快速排序算法#pragma omp parallel default(none) shared(B,C,len)

16、private(i)/- 这个 for 循环是并行的int j = 50000;#pragma omp forfor (i = 0; i<len; i+)Bi = j-;Ci = j-;/初始化 B,C 数组clock_t begin = clock();/ 计时开始点#pragma omp parallel default(none) shared(B,D,E,short_len) private(i)/- 这个 for 循环是 并行的#pragma omp forfor (i = 0; i<short_len; i+)/- 这个 for 循环是并行的Di = Bi; 将B口的前

17、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 sectionquicksort(D, 0, short_len - 1);/ 对 D 排序#pragma omp sectionquicksort(E, 0, short_len - 1);/ 对 E 排序for (; k<len; k+)/ 将D和E口进行归并排序放入

18、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;快速排序的并行B 里面else- 9 -Bk = Dn - 1;k += 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 - begin);cout << "

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论