1、for(inti=0;i10000;i+) intmain()doubledResult;longlBeforeclock(); #pragmaompparalleltest(i);dResult(double)(clock()-lBefore);printf(nTotalTime:%fms.n,dResult);system(pause);return五. 结果分析运行时间是串行的一半。明显降低了时间的消耗。实验二 各种同步机制的性能比较以矩阵乘进行并行串行比较四. 实验代码和结果实验代码:/ juzhencheng.cpp : 定义控制台应用程序的入口点。#include stdafx.h
2、#include #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, endTime; long long sum; omp_set_num_threads(num_thread); /-对矩阵A和矩阵B进行初始化- for (i = 0; in; i+) t = i + 1; for (j = 0; j j+) Aij = t+; Bij = 1; /-矩阵乘
3、法并行算法- startTime = clock(); sum = 0;#pragma omp parallel shared(A,B,C) private(i,j,k) #pragma omp for schedule(dynamic) for (i = 0; for (j = 0; Cij = 0; for (k = 0; k k+) Cij += Aik * Bkj; i+) j+) sum += Cij; endTime = clock(); paralleltime = endTime - startTime; printf(矩阵C所有元素和为sum=%lld 并行计算时间time=
4、%dmsn, sum, paralleltime); Cij = 0; for (k = 0; Cij += Aik * Bkj; serialtime = endTime - startTime;矩阵C所有元素和为sum=%lld 串行计算时间time=%dmsn, sum, serialtime);相对加速比为: %d/%dn, serialtime, paralleltime);int _tmain(int argc, _TCHAR* argv) int n, num_thread;请输入矩阵的节数(整数Niostreamusing namespace std;static long n
5、um_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_time=clock();#pragma omp parallel sections reduction(+:sum) p
6、rivate(x,i) #pragma omp section for (i=omp_get_thread_num();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(); coutPi=piendl;并行time=end_time-start_time /串行- sum=0.0; for (i=0;i+) 串行time= system(结果:实验四 多核并行排序实验1、熟悉快速排序的串行算法2、熟悉快速排序的并行算法 3、实现快速排序的并行算法 硬件环境
7、:。,OS:,软件工具:VC1、快速排序的基本思想2、快速排序算法的性能3、快速排序算法并行化/ bingxingpaixu.cpp :#include= u) return; m = l; for (i = l + 1; i = u; if (Ai Al)/*不管是选第一个元素作为pivot还是最后一个作为pivot,假如我们想得到的是从小到大的序列,那么最坏的输入情况就是从大到小的;如果我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/ swap(A+m, Ai); swap(Al, Am); quicksort(A, l, m - 1); quicksort(A, m +
8、 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 short_len = len / 2; int B10000, C10000, D5000, E5000;/-将B分为两个小的数组,并行的对他们调用快速排序算法 #pragma omp parallel default(none) shared(B,C,len) private(i)/
9、-这个for循环是并行的 int j = 50000;#pragma omp for len; Bi = j-; Ci = j-; /初始化B,C数组 clock_t begin = clock();/-计时开始点 #pragma omp parallel default(none) shared(B,D,E,short_len) private(i)/-这个for循环是并行的 short_len; i+)/-这个for循环是并行的 Di = Bi;/将B的前5000个数放入D Ei = Bi + 5000;/将B的后5000个数放入E #pragma omp parallel default
10、(none) shared(E,D,short_len) /private(i)-快速排序的并行region #pragma omp parallel sections quicksort(D, 0, short_len - 1);/对D排序 quicksort(E, 0, short_len - 1);/对E排序 for (; k+)/-将D和E进行归并排序放入B里面 if (mshort_len & nshort_len) if (Dn = Em) Bk = Dn; n+; else Bk = Em; m+; if (m = short_len | n = short_len) if (m
11、 = short_len) Bk = Dn - 1; k += 1; break; if (/*m=short_len &*/ nshort_len) int tem = short_len - n; for (int p = 0; ptem; p+) Bk = Dn; n+; k+; else if (/*n=short_len &*/ m int tem = short_len - m; for (int q = 0; q q+) Bk = Em; m+; /-归并算法结束 clock_t end = clock();/-计时结束点 cost = (double)(end - begin); cout 并行时间 cost endl; /串行开始 begin = clock(); quicksort(C, 0, len - 1); end = clock();串行时间 system(封面设计: 贾丽地 址:中国河北省秦皇岛市河北大街438号邮 编:066004电 话:0335-*传 真:网 址:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1