里仁多核程序设计实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#pragma omp for schedule(dynamic)
for (i = 0; i<n; i++){
for (j = 0; j<n; j++){
C[i][j] = 0;
for (k = 0; k<n; k++){
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
for (i = 0; i<n; i++)
solve(n, num_thread);
}
return 0;
}
实验结果:
实验三蒙特卡洛法并行求解Pi值
一.实验目的与要求
二.实验环境及软件
三.实验内容
四.实验代码和结果
代码:
// Pi.cpp :定义控制台应用程序的入口点。
//求圆周率PI
#include "stdafx.h"
#include <windows.h>
for (j = 0; j<n; j++)
sum += C[i][j];
endTime = clock();
serialtime = endTime - startTime;
printf("矩阵C所有元素和为sum=%lld串行计算时间time=%dms\n", sum, serialtime);
printf("相对加速比为:%d/%d\n", serialtime, paralleltime);
startTime = clock();
sum = 0;
for (i = 0; i<n; i++){
for (j = 0; j<n; j++){
C[i][j] = 0;
for (k = 0; k<n; k++){
C[i][j] += A[i][k] * B[k][j];
}
}Hale Waihona Puke Baidu
}
for (i = 0; i<n; i++)
#pragma omp parallel for
for (int i = 0; i < 10000; i++)
test(i);
dResult = (double)(clock() - lBefore);
printf("\nTotal Time: %f ms.\n", dResult);
system("pause");
A[i][j] = t++;
B[i][j] = 1;
}
}
//----------------矩阵乘法并行算法------------------
startTime = clock();
sum = 0;
#pragma omp parallel shared(A,B,C) private(i,j,k)
{
for (j = 0; j<n; j++)
sum += C[i][j];
endTime = clock();
paralleltime = endTime - startTime;
printf("矩阵C所有元素和为sum=%lld并行计算时间time=%dms\n", sum, paralleltime);
#include <time.h>
#include <omp.h>
#include <iostream>
using namespace std;
static long num_steps=1000000000;//定义所分的块数
#define NUM_THREADS 2 //定义所开启的线程数
int _tmain(int argc, _TCHAR* argv[]) {
#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){
int i, j, t, k, paralleltime, serialtime;
多核程序设计实验报告
Multi-core Programming Experiment Report
学生所在学院:里仁学院
学生所在班级:
学 生 姓 名 :
学 生学号:
指 导 教 师 :
教务处
2014年 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;
long lBefore = clock();
clock_t startTime, endTime;
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++){
return 0;
}
五.结果分析
运行时间是串行的一半。明显降低了时间的消耗。
实验二
一.实验目的与要求
二.实验环境及软件
三.实验内容
以矩阵乘进行并行串行比较
四.实验代码和结果
实验代码:
// juzhencheng.cpp :定义控制台应用程序的入口点。
#include "stdafx.h"
#include <omp.h>
}
int _tmain(int argc, _TCHAR* argv[]){
int n, num_thread;
printf("请输入矩阵的节数(整数N<=2000),再输入并行的线程数。\n\n");
while (scanf("%d%d", &n, &num_thread) != EOF)
{
printf("你输入的矩阵节数为:%d并行线程数为:%d\n", n, num_thread);
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;
//并行--------------------------------------
for (i = 0; i<n; i++){
for (j = 0; j<n; j++){
C[i][j] = 0;
for (k = 0; k<n; k++){
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
for (i = 0; i<n; i++)
solve(n, num_thread);
}
return 0;
}
实验结果:
实验三蒙特卡洛法并行求解Pi值
一.实验目的与要求
二.实验环境及软件
三.实验内容
四.实验代码和结果
代码:
// Pi.cpp :定义控制台应用程序的入口点。
//求圆周率PI
#include "stdafx.h"
#include <windows.h>
for (j = 0; j<n; j++)
sum += C[i][j];
endTime = clock();
serialtime = endTime - startTime;
printf("矩阵C所有元素和为sum=%lld串行计算时间time=%dms\n", sum, serialtime);
printf("相对加速比为:%d/%d\n", serialtime, paralleltime);
startTime = clock();
sum = 0;
for (i = 0; i<n; i++){
for (j = 0; j<n; j++){
C[i][j] = 0;
for (k = 0; k<n; k++){
C[i][j] += A[i][k] * B[k][j];
}
}Hale Waihona Puke Baidu
}
for (i = 0; i<n; i++)
#pragma omp parallel for
for (int i = 0; i < 10000; i++)
test(i);
dResult = (double)(clock() - lBefore);
printf("\nTotal Time: %f ms.\n", dResult);
system("pause");
A[i][j] = t++;
B[i][j] = 1;
}
}
//----------------矩阵乘法并行算法------------------
startTime = clock();
sum = 0;
#pragma omp parallel shared(A,B,C) private(i,j,k)
{
for (j = 0; j<n; j++)
sum += C[i][j];
endTime = clock();
paralleltime = endTime - startTime;
printf("矩阵C所有元素和为sum=%lld并行计算时间time=%dms\n", sum, paralleltime);
#include <time.h>
#include <omp.h>
#include <iostream>
using namespace std;
static long num_steps=1000000000;//定义所分的块数
#define NUM_THREADS 2 //定义所开启的线程数
int _tmain(int argc, _TCHAR* argv[]) {
#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){
int i, j, t, k, paralleltime, serialtime;
多核程序设计实验报告
Multi-core Programming Experiment Report
学生所在学院:里仁学院
学生所在班级:
学 生 姓 名 :
学 生学号:
指 导 教 师 :
教务处
2014年 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;
long lBefore = clock();
clock_t startTime, endTime;
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++){
return 0;
}
五.结果分析
运行时间是串行的一半。明显降低了时间的消耗。
实验二
一.实验目的与要求
二.实验环境及软件
三.实验内容
以矩阵乘进行并行串行比较
四.实验代码和结果
实验代码:
// juzhencheng.cpp :定义控制台应用程序的入口点。
#include "stdafx.h"
#include <omp.h>
}
int _tmain(int argc, _TCHAR* argv[]){
int n, num_thread;
printf("请输入矩阵的节数(整数N<=2000),再输入并行的线程数。\n\n");
while (scanf("%d%d", &n, &num_thread) != EOF)
{
printf("你输入的矩阵节数为:%d并行线程数为:%d\n", n, num_thread);
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;
//并行--------------------------------------