如何进行指令调度使其执行延迟时间最短?进行指令调度所获得的加速比是多少

如何进行指令调度使其执行延迟时间最短?进行指令调度所获得的加速比是多少,第1张

4.3 根据需要下面的循环并进行指令调度,直到没有任何延迟。指令的延迟如表4.4。 LOOP: L.D F0,0(R1) MUL.D F0,F0,F2 L.D F4,0(R2) ADD.D F0,F0,F4 S.D F0,0(R2) DSUBI R1,R1,#8 DSUBI R2,R2,#8 BNEZ R1,LOOP 解:将循环两次,进行指令调度,即可以消除延迟,代码如下: LOOP: L.D F0,0(R1) L.D F10,-8(R1) MUL.D F0,F0,F2 MUL.D F10,F10,F2 L.D F4,0(R2) L.D F14,-8(R2) ADD.D F0,F0,F4 ADD.D F10,F10,F14 DSUBI R1,R1,16 S.D 0(R2),F0 DSUBI R2,R2,16 BNEZ R1,LOOP S.D 8(R2),F10 4.4 假设有一条长流水线,仅仅对条件转移指令使用分支目标缓冲。假设分支预测错误的开销为4个时钟周期,缓冲不命中的开销为3个时钟周期。假设:命中率为90%,预测精度为90%,分支频率为15%,没有分支的基本CPI为1。 (1) 求程序执行的CPI。 (2) 相对于采用固定的2个时钟周期延迟的分支处理,哪种方法程序执行速度更快? 解:(1)程序执行的CPI = 没有分支的基本CPI(1) + 分支带来的额外开销 分支带来的额外开销是指在分支指令中,缓冲命中但预测错误带来的开销与缓冲没有命中带来的开销之和。 分支带来的额外开销= 15% * (90%命中×10%预测错误×4 + 10%没命中×3)= 0.099 所以,程序执行的CPI = 1 + 0.099 = 1.099 (2)采用固定的2 个时钟周期延迟的分支处理CPI = 1 + 15%×2 = 1.3 由(1)(2)可知分支目标缓冲方法执行速度快。 4.5 假设分支目标缓冲的命中率为90%,程序中无条件转移指令的比档迹例为5%,没有无条件转移指令的程序CPI值为1。假设分支目标缓冲中包含分支目标指令,允许无条件转移指令进入分支目标缓冲,则程序的CPI值为多少? 解:设每条无条件转移指令的延迟为x,则有: 1+5%×x=1.1 x=2 当分支目标缓冲命中时,无条件转移指令的延迟为0。 所以 程序的CPI = 1 + 2 × 5% ×(1 -90%) =1.01 4.6 下面的一段MIPS汇编程序是计算高斯消去法中的关键一步,用于完成下面公式的计算: Y = a  X + Y 其浮点指令延迟如表4.3所示,整数指令均为1个时钟周期完成,浮点和整数部件均采用流水。整数 *** 作之间以及与其它所有浮点 *** 作雹蠢型之间的延迟为0,转移指令的延迟为0。X中的最后一个元素存放在存储器中的地址为DONE。 FOO: L.D F2,0(R1) MUT.D F4,F2,F0 L.D F6,0(R2) ADD.D F6,F4,F6 S.D F6,0[R2] DADDIU R1,R1,#8 DADDIU R2,R2,#8 DSUBIU R3,R1,#DONE BNEZ R3, FOO (1) 对于标准的MIPS单流水线,上述循环计算一源猜个Y值需要多少时间?其中有多少空转周期? (2) 对于标准的MIPS单流水线,将上述循环顺序4次,不进行任何指令调度,计算一个Y值平均需要多少时间?加速比是多少?其加速是如何获得的? (3) 对于标准的MIPS单流水线,将上述循环顺序4次,优化和调度指令,使循环处理时间达到最优,计算一个Y值平均需要多少时间?加速比是多少? (1) 对于采用如图4.8前瞻执行机制的MIPS处理器(只有一个整数部件)。当循环第二次执行到 BNEZ R3,FOO 时,写出前面所有指令的状态,包括指令使用的保留站、指令起始节拍、执行节拍和写结果节拍,并写出处理器当前的状态。 (2) 对于2路超标量的MIPS流水线,设有两个指令流出部件,可以流出任意组合的指令,系统中的功能部件数量不受限制。将上述循环4次,优化和调度指令,使循环处理时间达到最优。计算一个Y值平均需要多少时间?加速比是多少? (3) 对于如图4.13结构的超长指令字MIPS处理器,将上述循环4次,优化和调度指令,使循环处理时间达到最优。计算一个Y值平均需要多少时间?加速比是多少? 解:(1) L.D F2, 0(R1) 1 Stall MUT.D F4, F2, F0 2 L.D F6, 0(R2) 3 Stall Stall ADD.D F6, F4, F6 4 Stall Stall S.D F6, 0[R2] 5 DADDIU R1, R1, #8 6 DADDIU R2, R2, #8 7 DSUBIU R3, R1, #DONE 8 BNEZ R3, FOO 9 所以,共有14 个时钟周期,其中有5 个空转周期。 (2)循环顺序4 次,不进行任何指令调度,则指令1~5 及其间的stall 都是必要的,只是指令6~9 只需执行一次,因此,共有 10 × 4 + 4 = 44 个时钟周期,计算出4 个Y 值,所以计算一个Y 值需要11 个时钟周期,加速比为:14/11 = 1.27 。加速主要是来自减少控制开销,即减少对R1、R2 的整数 *** 作以及比较、分支指令而来的。 (3)循环顺序4 次,优化和调度指令,如下: L.D F2, 0(R1) L.D F8, 8(R1) L.D F14, 16(R1) L.D F20, 24(R1) MUT.D F4, F2, F0 MUT.D F10, F8, F0 MUT.D F16, F14, F0 MUT.D F22, F20, F0 L.D F6, 0(R2) L.D F12, 8(R2) L.D F18, 16(R2) L.D F24, 24(R2) ADD.D F6, F4, F6 ADD.D F12, F10, F12 ADD.D F18, F16, F18 ADD.D F24, F22, F24 S.D F6, 0[R2] S.D F12, 8[R2] S.D F18, 16[R2] S.D F24, 24[R2] DADDIU R1, R1, #32 DADDIU R2, R2, #32 DSUBIU R3, R1, #DONE BNEZ R3, FOO 共用了24 个时钟周期,则计算一个Y 值平均需要 24/4 = 6 个时钟周期, 加速比:14/6 = 2.33 (4) 指令 指令执行时钟 流出 执行 写结果 确认 L.D F2, 0(R1) 1 2 3 4 MUL.D F4, F2, F0 2 4 5 6 L.D F6, 0(R2) 3 4 6 7 ADD.D F6, F4, F6 4 8 9 10 S.D F6, 0(R2) 5 11 12 13 DADDIU R1, R1, #8 6 7 8 DADDIU R2, R2, #8 7 8 9 DSUBIU R3,R1,#DONE 8 9 10 BNEZ R3, FOO 9 10 L.D F2, 0(R1) 10 11 13 14 MUL.D F4, F2, F0 11 13 14 15 L.D F6, 0(R2) 12 13 15 16 ADD.D F6, F4, F6 13 17 18 19 S.D F6, 0(R2) 14 20 21 22 DADDIU R1, R1, #8 15 16 17 DADDIU R2, R2, #8 16 17 18 DSUBIU R3,R1,#DONE 17 18 19 BNEZ R3, FOO 18 名称 保留站 Busy Op Vj Vk Qj Qk Dest A Add1 yes ADD.D Regs[F4] Regs[F6 ] Add2 no Add3 no Mult1 yes Mult2 no 项号 ROB Busy 指令 状态 目的 Value 1 yes ADD.D F6, F4, F6 执行 F6 Regs[F4]+Regs[F6] 2 yes S.D F6, 0(R2) 流出 Mem[0+Regs[R2]] #2 字段 浮点寄存器状态 F0 F2 F4 F6 F8 F10 … F30 ROB项编号 1 Busy yes … (5) 整数指令 浮点指令 时钟周期数 L.D F2, 0(R1) 1 L.D F8, 8(R1) 2 L.D F14, 16(R1) MUT.D F4, F2, F0 3 L.D F20, 24(R1) MUT.D F10, F8, F0 4 L.D F6, 0(R2) MUT.D F16, F14, F0 5 L.D F12, 8(R2) MUT.D F22, F20, F0 6 L.D F18, 16(R2) ADD.D F6, F4, F6 7 L.D F24, 24(R2) ADD.D F12, F10, F12 8 DADDIU R1, R1, #32 ADD.D F18, F16, F18 9 S.D F6, 0(R2) ADD.D F24, F22, F24 10 S.D F12, 8(R2) 11 S.D F18,16(R2) 12 S.D F24, 24(R2) 13 DADDIU R2, R2, #32 14 DSUBIU R3, R1, #DONE 15 BNEZ R3, FOO 16 计算一个Y值需要 16/4 = 4 个时钟周期,加速比 = 14/4 = 3.5 (6) 访存1 访存2 浮点指令1 浮点指令2 整数指令 时钟 周期 L.DF2, 0(R1) L.D F8, 8(R1) 1 L.DF14, 16(R1) L.DF20, 24(R1) L.DF6, 0(R2) L.DF12, 8(R2) MUT.DF4, F2, F0 MUT.DF10, F8, F0 3 L.DF18, 16(R2) L.DF24, 24(R2) MUT.DF16, F14, F0 MUT.DF22, F20, F0 4 ADD.DF6, F4, F6 ADD.DF12, F10, F12 5 ADD.DF18, F16, F18 ADD.DF24, F22, F24 DADDIU R1, R1, #32 6 DADDIU R2, R2, #32 7 DSUBIUR3, R1, #DONE 8 BNEZ R3, FOO 9 S.DF6, -32(R2) S.DF12, -24(R2) 10 S.DF18,-16(R2) S.DF24, -8(R2) 11 计算一个Y值需要 11/4 个时钟周期,加速比 = 14/(11/4) = 56/11

1楼的不是遗传算法吧!

刚好做过这个遗传算法解背包问题的论文,给你回答啦~~独家哦,分数要给偶~~

1、程序开发环境

开发环境:Visual C++6.0 (把Fortran程序改为VC)

*** 作系统:Windows 2003 Professional

2、程序性能对比

运行时间与加速比(如表1所示)

进程数p(个) 1 2 4

运行时间t(秒) 129s 78s 38s

加速比s 1.65 3.38

表1、运行时间与加速比

3、程序运行结果:

实例数据:

假设物体的重量Weight、物体的收益Profit和背包的容量Contain 分别为:

Weight={ 80,82,85,70,72,70,66,50,55,25 ,

50,55,40,48,50, 32,22,60,30,32 ,

40,38,35,32,25, 28,30,22,50,30 ,

45,30,60,50,20 ,65,20,25,30,10 ,

20,25,15,10,10 ,10,4, 4, 2, 1 }

Profit={ 220,208,198,192,180,180,165,162,160,158,

155,130,125,122,120 , 118,115,110,105,101,

100,100,98, 96, 95, 90, 88, 82, 80, 77 ,

75, 73, 72, 70, 69, 66, 65, 63, 60, 58,

56, 50, 30, 20, 15, 10, 8, 5, 3, 1}

Contain=1000,

如何选择哪些物品装入该背包可使得在背包的容量约束限制之内所装物品的总价值最大?

传统的算法(动态规划、递归回溯法和贪心算法所得结果:

总价值为3077 , 总重量为999。

2001年张铃,张钹教授在计算机学报上发表的《佳点集遗传算法》所得结果

总价值为3103, 总重量为1000。梁首

我们算法所得结果: 总价值为3103, 总重量为1000。

我们所求得最优解的个体分配情况为:

11010 10111 10110 11011 01111 11101 00001 01001 10000

01000

算法 最大迭代次数 总价值为 总重量为

传统的算法 400 3077 999

佳点集算法 70 3103 1000

遗传算法75 3103 1000

// knapsack.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <AfxWin.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

#include <conio.h>

#include <stdio.h>

// 重要常量参数

#define popsize 200 //种群的规模

#define pc 0.618/橡兄数/杂交概率

#define pm 0.03//变异概率

#define lchrom 50 //染色体长度

#define maxgen 1000 //最大进化代数尘侍

struct population

{

unsigned int chrom[lchrom] //染色体

double weight //背包重量

double fitness //适应度

unsigned int parent1,parent2,cross //双亲、交叉点

}

//新生代种群、父代种群

struct population oldpop[popsize],newpop[popsize]

//背包问题中物体重量、收益、背包容量

int weight[lchrom],profit[lchrom],contain

//种群的总适应度、最小、最大、平均适应度

double sumfitness,minfitness,maxfitness,avgfitness

//计算适应度时使用的 惩罚函数系数

double alpha

//一个种群中最大和最小适应度的个体

intminpop,maxpop

/* 读入背包信息,并且计算惩罚函数系数 */

void read_infor()

{

FILE *fp

int j

//获取背包问题信息文件

if ((fp=fopen("knapsack.txt","r"))==NULL)

{

//读取文件失败

AfxMessageBox("The file is not found",MB_OK,NULL)

return

}

//读入物体收益信息

for (j=0j<lchromj++)

{

fscanf(fp,"%d",&profit[j])

}

//读入物体重量信息

for (j=0j<lchromj++)

{

fscanf(fp,"%d",&weight[j])

}

//读入背包容量

fscanf(fp,"%d",&contain)

fclose(fp)

}

//根据计算的个体重量,判断此个体是否该留在群体中

double cal_weight(unsigned int *chr)

{

int j

double pop_weight//背包重量

pop_weight=0

for (j=0j<lchromj++)

{

pop_weight=pop_weight+(*chr)*weight[j]

chr++

}

return pop_weight

}

/* 种群中个体适应度计算*/

double cal_fit(unsigned int *chr)

{

int j

double pop_profit//适应度

pop_profit=0

// pop_weight=0

for (j=0j<lchromj++)

{

pop_profit=pop_profit+(*chr)*profit[j]

// pop_weight=pop_weight+(*chr)*weight[j]

chr++

}

return pop_profit

}

/* 群体适应度的最大最小值以及其他信息 */

void statistics(struct population *pop)

{

int i

double tmp_fit

sumfitness=pop[0].fitness

minfitness=pop[0].fitness

minpop=0

maxfitness=pop[0].fitness

maxpop=0

for (i=1i<popsizei++)

{

//计算种群的总适应度

sumfitness=sumfitness+pop[i].fitness

tmp_fit=pop[i].fitness

//选择种群中最大适应度的个体

if ((tmp_fit>maxfitness)&&((int)(tmp_fit*10)%10==0))

{

maxfitness=pop[i].fitness

maxpop=i

}

//选择种群中最小适应度的个体

if (tmp_fit<minfitness)

{

minfitness=pop[i].fitness

minpop=i

}

//计算平均适应度

avgfitness=sumfitness/(float)popsize

}

// printf("\nthe max pop = %d",maxpop)

// printf("\nthe min pop = %d",minpop)

// printf("\nthe sumfitness = %f\n",sumfitness)

}

//报告种群信息

void report(struct population *pop,int gen)

{

int j

int pop_weight=0

printf("the generation is %d.\n",gen)//输出种群的代数

//输出种群中最大适应度个体的染色体信息

printf("The population's chrom is: \n")

for (j=0j<lchromj++)

{

if (j%5==0)

{ printf(" ")}

printf("%1d",pop[maxpop].chrom[j])

}

//输出群体中最大适应度

printf("\nThe population's max fitness is %d.",(int)pop[maxpop].fitness)

printf("\nThe knapsack weight is %d.\n\n",(int)pop[maxpop].weight)

}

/* 生成初始种群 */

void initpop()

{

int i,j,ispop

double tmpWeight

//变量用于判断是否为满足条件的个体

ispop=false

//生成popsize个种群个体

for(i=0i<popsizei++)

{

while (!ispop)

{

for(j=0j<lchromj++)

{

oldpop[i].chrom[j]=rand()%2 //随机生成个体的染色体

oldpop[i].parent1=0 //双亲

oldpop[i].parent2=0

oldpop[i].cross=0 //交叉点

}

//选择重量小于背包容量的个体,即满足条件

tmpWeight=cal_weight(oldpop[i].chrom)

if (tmpWeight<=contain)

{

oldpop[i].fitness=cal_fit(oldpop[i].chrom)

oldpop[i].weight=tmpWeight

oldpop[i].parent1=0

oldpop[i].parent2=0

oldpop[i].cross=0

ispop=true

}

}

//此个体可以加入到种群中

ispop=false

}

}

/* 遗传 *** 作 */

//概率选择试验

int execise(double probability)

{

double pp

//如果生成随机数大于相应的概率则返回真,否则试验不成功

pp=(double)(rand()%20001/20000.0)

if (pp<=probability) return 1

return 0

}

// 选择进行交叉 *** 作的个体

int selection(int pop)

{

double wheel_pos,rand_Number,partsum

int parent

//赌轮法选择

rand_Number=(rand()%2001)/2000.0

wheel_pos=rand_Number*sumfitness //赌轮大小

partsum=0

parent=0

do{

partsum=partsum+oldpop[parent].fitness

parent=parent+1

} while (partsum<wheel_pos &&parent<popsize)

return parent-1

}

/* 交叉 *** 作 */

int crossover(unsigned int *parent1,unsigned int *parent2,int i)

{

int j,cross_pos

if (execise(pc))

{

//生成交叉位置0,1,...(lchrom-2)

cross_pos=rand()%(lchrom-1)

}

else cross_pos=lchrom-1

for (j=0j<=cross_posj++)

{ //保留复制;

//包括在概率选择不成功时,父体完全保留

newpop[i].chrom[j]=parent1[j]

}

for(j=cross_pos+1j<=(lchrom-1)j++)

{

//从交叉点开始交叉

newpop[i].chrom[j]=parent2[j]

}

//记录交叉位置

newpop[i].cross=cross_pos

return 1

}

/* 变异 *** 作 */

int mutation(unsigned int alleles)

{

if (execise(pm))

{

if (alleles)

alleles=0

else alleles=1

}

//返回变异值,或者返回原值

return alleles

}

/* 群体更新 */

void generation()

{

unsigned int i,j,mate1,mate2

double tmpWeight

int ispop//记录是否是符合条件的个体

i=0

while (i<popsize)

{

ispop=false

while (!ispop)

{

//选择

mate1=selection(i)

mate2=selection(i+1)

//交叉

crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,i)

//变异

for (j=0j<lchromj++)

{

newpop[i].chrom[j]=mutation(newpop[i].chrom[j])

}

//选择重量小于背包容量的个体,即满足条件

tmpWeight=cal_weight(newpop[i].chrom)

if (tmpWeight<=contain)

{

newpop[i].fitness=cal_fit(newpop[i].chrom)

newpop[i].weight=tmpWeight

newpop[i].parent1=mate1

newpop[i].parent2=mate2

ispop=true

}

}

//此个体可以加入到种群中

i=i+1

}

}

void main(int argc, char* argv[])

{

int gen,oldmaxpop,k

double oldmax

read_infor()//读入背包信息

gen=0

srand( (unsigned)time( NULL ) )//置随机种子

initpop()

memcpy(&newpop,&oldpop,popsize*sizeof(struct population))

statistics(newpop)//统计新生种群的信息

report(newpop,gen)

while(gen<maxgen)

{

gen=gen+1

if (gen%100==0)

{

srand( (unsigned)time( NULL ) )//置随机种子

}

oldmax=maxfitness

oldmaxpop=maxpop

generation()

statistics(newpop)//统计新生代种群信息

//如果新生代种群中个体的最大适应度小于老一代种群

//个体的最大适应度,则保存老一代种群个体的最大适应度

//否则报告新生代的最大适应度

if (maxfitness<oldmax)

{

for(k=0k<lchromk++)

newpop[minpop].chrom[k]=oldpop[oldmaxpop].chrom[k]

newpop[minpop].fitness=oldpop[oldmaxpop].fitness

newpop[minpop].parent1=oldpop[oldmaxpop].parent1

newpop[minpop].parent2=oldpop[oldmaxpop].parent2

newpop[minpop].cross=oldpop[oldmaxpop].cross

statistics(newpop)

}

else if (maxfitness>oldmax)

{

report(newpop,gen)

}

//保存新生代种群的信息到老一代种群信息空间

memcpy(&oldpop,&newpop,popsize*sizeof(struct population))

}

printf("It is over.")

getch()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/12541932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存