七种方法求水仙花数
更新时间:2023-11-16 23:22:01 阅读量: 教育文库 文档下载
并行计算与多核多线程技术
课程报告
班级 学号 姓名
______ 水仙花数
______ 水仙花数
目 录
1.水仙花数的并行算法设计与实现·········7
1.1 .1
功能描述
1.1.2 解决方案
1.2算法设计················· ···7
1.2.1 串行算法设计 1.2.2并行算法设计
1.3 基于OpenMP的并行算法实现···········8 1.3.1 代码及注释(变量名 名字首字母 开头)
1.3.2 执行结果截图(体现串行时间、并行时间和加速比) 1.3.3 遇到的问题及解决方案
1.4 基于MPI的并行算法实现·············11 1.4.1 代码及注释(变量名 名字首字母 开头)
1.4.2 执行结果截图(体现串行时间、并行时间和加速比)
1.4.3 遇到的问题及解决方案
1.5 基于Java(Runnable)的并行算法实现·······13 1.5.1 代码及注释(变量名 名字首字母 开头)
1.5.2 执行结果截图(体现串行时间、并行时间和加速比)
1.5.3 遇到的问题及解决方案
1.6 基于Windows(.NET)的并行算法实现·······20 1.6.1 代码及注释(变量名 名字首字母 开头)
1.6.2 执行结果截图(体现串行时间、并行时间和加速比)
______ 水仙花数
1.6.3 遇到的问题及解决方案
2. 理论基础·····················22
2.1 并行计算机体系结构、并行计算模型、并行算法的概念 2.2并行计算机体系结构、并行计算模型、并行算法的关系
2.3实例说明并行计算机体系结构、并行计算模型、并行算法的关系
______ 水仙花数
评价
实践效果(正确度/加速比)
理论基础 难度 工作量 独立性
认证结果
______ 水仙花数
______ 水仙花数
1.水仙花数的并行算法设计与实现
1.1 .1功能描述
水仙花数又称阿姆斯特朗数。是指一种三位数,其各个数之立方和等于该数本身。水仙花数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。 1.1.2 解决方案 并行思想:
并行计算的原理就是把一个任务或者作业分配到多个处理器上并发执行。这样一来可以大大提高计算的效率。在本次课题中,要实现水仙花数的并行计算输出,就是把制定范围内的数用多个处理器进行计算,从而得到水仙花数的并行输出。再和串行执行方法进行比较,观察其优越性。 核心算法:
int hundreds = n / 100; int tens = n % 100 / 10; int ones = n % 10;
Return cube(hundreds) + cube(tens) + cube(ones) == n; 1.2算法设计 1.2.1 串行算法设计 for(xlh=100;xlh<1000;xlh++)
{
j=xlh/100;
z=(xlh-100*j)/10;
______ 水仙花数
t=xlh;
if(j*j*j+z*z*z+t*t*t==xlh) printf(\}
1.2.2 并行算法设计
for (int xlh=100+ id; xlh< 1000; xlh+=2) //1000以内的水仙花数
{ int j=xlh/100; //判断百位 int z=xlh0/10;//判断十位 int t=xlh;//个位 if(j*j*j+z*z*z+t*t*t ==xlh)//确定是否是水仙花数 printf(\输出水仙花数 }
1.3 基于OpenMP的并行算法实现 1.3.1 代码及注释(变量名 名字首字母 开头)
#include \#include \#include \#include
int _tmain(int argc, _TCHAR* argv[]) {
printf(\求水仙花数\\n\
cout<<\并行结果:\ clock_t t1=clock();//线程1 #pragma omp parallel for//并行开始
for(int i=100; i<1000; i++)//判断是否为水仙花数 {
int xlh=i/100;
int k=(i-100*xlh)/10; int l=i; Sleep(1);
if(xlh*xlh*xlh+k*k*k+l*l*l==i) printf(\ }
clock_t t2=clock();//并行结束
______ 水仙花数
double pt=t2-t1-0.0;
printf(\并行时间%f\\n\输出并行时间
clock_t t3=clock();//串行开始 for(int i=100; i<1000; i++) {
int xlh=i/100;
int k=(i-100*xlh)/10; int l=i; Sleep(1);
if(xlh*xlh*xlh+k*k*k+l*l*l==i) printf(\ }
clock_t t4=clock();//串行结束 double st=t4-t3-0.0;
printf(\串行时间%f\\n\ printf(\加速比%f\\n\ system(\ return 0; }
1.3.2 执行结果截图(体现串行时间、并行时间和加速比)
1.3.3 遇到的问题及解决方案 错误代码
int xlh,j,z,t,m,n;
int id=omp_get_thread_num();
omp_set_num_threads(NUM_THREADS);
clock_t t1=clock();
______ 水仙花数
#pragma omp parallel {
for(xlh=100+id;xlh<1000;xlh+=NUM_THREADS)//判断是否为水仙花数 {
j=xlh/100;
z=(xlh-100*j)/10; t=xlh;
if(j*j*j+z*z*z+t*t*t==xlh) printf(\ } }
clock_t t2=clock();
printf(\并行时间%d\\n\ printf(\串行水仙花数:\\n\
clock_t t3=clock();// for(xlh=100;xlh<1000;xlh++) {
j=xlh/100;
z=(xlh-100*j)/10; t=xlh;
if(j*j*j+z*z*z+t*t*t==xlh) printf(\}
clock_t t4=clock();
正确代码
int _tmain(int argc, _TCHAR* argv[]) {
printf(\求水仙花数\\n\
cout<<\并行结果:\
______ 水仙花数
return sum; }
public static void main(String []args)throwsInterruptedException {
JavaThread thread1=new JavaThread(1,1000);//确定开始以及结束值 JavaThread thread2=new JavaThread(2,1000); System.out.println(\并行结果:\);
long startTime=System.currentTimeMillis();//并行开始 thread1.start(); thread2.start(); thread1.join(); thread2.join();
long endTime=System.currentTimeMillis();
System.out.println(\并行时间:\+(endTime-startTime)); double t1=endTime-startTime;
startTime=System.currentTimeMillis();//并行结束
System.out.println(\串行结果:\);
JavaThread thread=new JavaThread(1,1000); thread.Flower();
endTime=System.currentTimeMillis();
System.out.println(\串行时间:\+(endTime-startTime)); double t2=endTime-startTime; System.out.println(\加速比\+t2/t1);
______ 水仙花数
} }
1.5.2 执行结果截图(体现串行时间、并行时间和加速比)
1.5.3 遇到的问题及解决方案 错误代码及后果
import java.lang.Thread;
class JavaThread extends Thread {
private int start; private int end;
private int sum=0;
public JavaThread(int start,int end) {
super();
this.start=start; this.end=end;
______ 水仙花数
}
public void run()//并行函数 {
int a,b,c;
for(int xlh=start;xlh<=end;xlh+=2) {
a=xlh/100; b=(xlh-a*100)/10; c=xlh; try { sleep(1);
} catch (InterruptedException e) { e.printStackTrace(); }
后果:
输出结果错误.
分析:应声明表明JavaThread类继承 Thread类为公共类. 正确代码
import java.lang.Thread;
public class JavaThread extends Thread {
private int start;
______ 水仙花数
private int end;
private int sum=0;
public JavaThread(int start,int end) {
super();
this.start=start; this.end=end; }
public void run()//并行函数 {
int a,b,c;
for(int xlh=start;xlh<=end;xlh+=2) {
a=xlh/100; b=(xlh-a*100)/10; c=xlh; try { sleep(1);
} catch (InterruptedException e) { e.printStackTrace(); }
分析
______ 水仙花数
对C#编程掌握不熟悉。
1.6 基于Windows(.NET)的并行算法实现 1.6.1 代码及注释(变量名 名字首字母 开头)
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics;
class Threads {
static void Main() {
Stopwatch t1 = new Stopwatch(); Work work1 = new Work(0);
ThreadStart thread1 = new ThreadStart(work1.Work1);//调用work函数 Thread newthread1 = new Thread(thread1); Work work2 = new Work(1);
ThreadStart thread2 = new ThreadStart(work2.Work1); Thread newthread2 = new Thread(thread2); Console.Write(\并行结果:\\n\); t1.Start();//并行开始 newthread1.Start(); newthread2.Start(); newthread1.XLHoin(); newthread2.XLHoin(); t1.Stop();//并行结束
TimeSpan timeSpan = t1.Elapsed;
double pt = timeSpan.TotalMilliseconds; Console.Write(\并行时间:{0}\\n\, pt); Console.Write(\串行结果:\\n\); t1.Start();//串行开始 new Work(0).func(); t1.Stop();//串行结束
TimeSpan timeSpan2 = t1.Elapsed;
double st = timeSpan2.TotalMilliseconds; Console.WriteLine(\串行时间:{0}\, st); Console.WriteLine(\加速比:{0}\, st / pt); Console.Read();
______ 水仙花数 } }
class Work {
private int start; public Work(int start) {
this.start = start; }
public void Work1()//并行函数求水仙花数 {
int m;
for (int i = 1; i < 10; i++)
for (int xlh = 0; xlh < 10; xlh++) for (int k = start; k < 10; k += 2) {
if (i * i * i + xlh * xlh * xlh + k * k * k == 100 * i + 10 * xlh + k) {
m = i * i * i + xlh * xlh * xlh + k * k * k; Console.WriteLine(m); } } }
public void func()//串行函数 {
int m;
for (int i = 1; i < 10; i++)
for (int xlh = 0; xlh < 10; xlh++) for (int k = start; k < 10; k++) {
if (i * i * i + xlh * xlh * xlh + k * k * k == 100 * i + 10 * xlh + k) {
m = i * i * i + xlh * xlh * xlh + k * k * k; Console.WriteLine(m); } } } }
1.6.2 执行结果截图(体现串行时间、并行时间和加速比)
______ 水仙花数
1.6.3 遇到的问题及解决方案
遇到的问题:期间一直伴随着很多的拼写错误,还有很多其他错误想不起来了。马虎,编程不熟练。导致编译过程很多错误。一直在改正改正。 解决方案:细心、耐心+恒心。
2. 理论基础
2.1 并行计算机体系结构、并行计算模型、并行算法的概念
答:(1)并行计算体系结构:并行计算科学中主要研究的是空间上的并行问题。从程序和
算法设计人员的角度来看,并行计算又可分为数据并行和任务并行。一般来说,因为数据并行主要是将一个大任务化解成相同的各个子任务,比任务并行要容易处理。
空间上的并行导致了两类并行机的产生,按照Flynn的说法分为:单指令流多数据流(SIMD)和多指令流多数据流(MIMD)。我们常用的串行机也叫做单指令流单数据流(SISD)。MIMD类的机器又可分为以下常见的五类:并行向量处理机(PVP)、对称多处理机(SMP)、大规模并行处理机(MPP)、工作站机群(COW)、分布式共享存储处理机(DSM)。 (2)并行计算模型:(1)访存模型:并行计算机有以下五种访存模型:均匀访存模型(UMA);非均匀访存模型(NUMA);全高速缓存访存模型(COMA);一致性高速缓存非均匀存储访问模型(CC-NUMA);非远程存储访问模型(NORMA)。
(2)计算模型:不像串行计算机那样,全世界基本上都在使用冯·诺伊
曼的计算模型;并行计算机没有一个统一的计算模型。不过,人们已经提出了几种有价值的参考模型:PRAM模型,BSP模型,LogP模型,C^3模型等。
(3)并行算法:并行算法是并行计算中非常重要的问题。并法研究应该确立一个“理论-设计-实现-应用”的系统方法,形成一个完善的 “架构—算法—编程” 方法论,这样才能保证并行算法不断发展并变得更加实用。
2.2并行计算机体系结构、并行计算模型、并行算法的关系
______ 水仙花数
2.3实例说明并行计算机体系结构、并行计算模型、并行算法的关系
______ 水仙花数
正在阅读:
七种方法求水仙花数11-16
山村的早晨教案10-15
西充新城核心区设计说明05-20
统计学原理形成性考核册答案作业12-07
植树节写一段话12-06
财政部、民政部关于全民所有制事业单位工作人员因公负伤致残抚恤06-18
三八妇女节的日记三篇10-29
工程测量中级复习题05-21
幼儿园小班数学教案《生活中的数字》04-12
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 求水
- 仙花
- 方法
- 生活大爆炸 - 第一季 - 剧本台词 - 中英文对照1.07 - 图文
- 会计学原理总结
- 铁总财〔2016〕119号-中国铁路总公司关于明确全面实施营改增有关事项的通知
- 小学数学应用题分类解题--行程应用题
- SINUMERIK 840D基础编程概述
- 外国文学史欧美卷 复习资料
- 1868+课程与教学论
- 连锁酒店总部指导分店销售手册1
- HP P2000G3存储官方配置文档(中文) - 图文
- 大学生二手物品交易网站的设计与实现
- 静电场中的导体与电介质一章习题解答
- 5#连铸机三规一制
- 哈佛管理导师-时间管理
- 武汉大学思修2004-2005学年上A
- 八年级道德与法治上册辨析题汇总
- 优秀计算机毕业论文 VB图书馆管理系统论文范文 计算机毕业设计范文
- 从京东商城浅析B2C发展 论文文献综述
- 中国农业大学研究生数值分析考试重点及笔记 - 图文
- 西工大18春《JAVA高级网络编程》平时作业
- 魔兽全职业输出宏