非线性流水线无冲突调度算法 实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//输出 for(i=0; i<Row; i++){ for(j=0; j<temp.back()+Vol; j++) cout << Time[i][j] << " "; cout << endl; } } /*计算初始冲突向量*/ T Vector(int Row, int Vol) { T res=0; int i, j, k; for(i=0; i<Row; i++){ for(j=0; j<Vol-1; j++){ if(Map[i][j]){ for(k=1; k<Vol-j; k++){ if(Map[i][j+k]) res = res | (1<<(k-1)); } } } } return res; } /*计算简单循环(深度优先搜索)*/ void Cal(T vc, int size) { int i; /*检测环*/ for(i=0; i<size-1; i++){ if(Route[i].State == Route[size-1].State){ Print(vc, size); return; } } /*记录路径*/ for(i=1; i<=Vol; i++){ if((Route[size-1].State&(1<<(i-1))) == 0){ Route[size].step = i;
实验目的
理解并实现非线性流水线无冲突调度算法。
问题的分析和解决思路
非线性流水线的禁止向量: 预约表中每一行任意两个“×”之间的距离都计算出来,去掉重复的。 由禁止向量得到冲突向量:C=(CnCn-1…C2C1) 其中:n 是禁止向量中的最大值。Cn 总为 1 如果 i 在禁止向量中,则 Ci=1,否则 Ci=0。 由冲突向量构造状态图: 把冲突向量送入一个 n 位逻辑右移移位器;如果移位器移出 0,用移位器中 的值与初始冲突向量作“按位或”运算,得到一个新的冲突向量;否则不作任何 处理;如此重复 n 次。 对于中间形成的每一个新的冲突向量,也要按照这一方法进行处理。 在初始冲突向量和所有的新形成的冲突向量之间用带箭头的线连接, 当新形成的 冲突向量出现重复时可以合并到一起。 首先对于数据的输入需要一张预约表(如下图) ,预约表中每一行任意两个 “×”之间的距离都计算出来,去掉重复的,这样我们就可以得到一个初始的禁 止向量。
int Row, Vol; int count=0; R Route[33]; vector<string> Ans; vector<string>::iterator ite; /*打印时空图*/ void Print(T vc, int size) { int i, j, k; string temp; /*去重并计算每条指令起始时间*/ temp.push_back(Route[0].step); for(i=1; i<size-1; i++) temp.push_back(Route[i].step+temp.back()); if(Route[size-1].State == vc) temp.push_back(Route[size-1].step+temp.back()); for(ite=Ans.begin(); ite!=Ans.end(); ite++){ if((*ite) == temp) return; } Ans.push_back(temp); /*输出简单循环*/ cout << "简单循环" << ++count << ":"; for(i=1; i<temp.length(); i++) printf("%d ", temp[i]-temp[i-1]); printf("\n 平均启动距离:%d\n", temp.back()/(i-1));
回车后程序将计算并打印各种无冲突调度方案的时空图。
程序代码
#include <iostream> #include <fstream> #include <string> #include <vector> #include <bitset> using namespace std; typedef unsigned int T; typedef struct route{ int step; T State; }R; int Map[100][32]; int Time[200][97];
程序使用说明
首先输入预约表的大小(输入格式为:功能段 时间,比如输入 4 7 表示 4 个功 能段,7 个时间段,即 4X7 大小的矩阵) 然后程序会提示您输入预约表内容,1 代表使用, 0 代表空闲(比如 4X7 矩阵, 一共输入 28 个 0 或 1,相互之间以空格隔开,每输入 7 个数后换行)
wenku.baidu.com
Route[size].State = Route[size-1].State>>i | vc; Cal(vc, size+1); } } } int main() { T vc; string bin; int i, j; cout << "请输入预约表的大小(输入格式为:功能段 时间,比如输入 4 7 表示 4 个功能 段,7 个时间段,即 4X7 大小的矩阵):" << endl; cin >> Row >> Vol; cout << "请输入预约表: 1 代表使用, 0 代表空闲 (比如 4X7 矩阵, 一共输入 28 个 0 或 1, 相互之间以空格隔开,每输入 7 个数后换行)" << endl; for(i=0; i<Row; i++) for(j=0; j<Vol; j++) cin >> Map[i][j]; vc = Vector(Row, Vol); printf("初始冲突向量为:("); for(i=Vol-2; i>=0; i--) bin.push_back((vc>>i)%2 + '0'); cout <<bin << ")" << endl; Route[0].step = 0; Route[0].State = vc; Cal(vc, 1); system("pause"); return 0; }
memset(Time, 0, 200*97*sizeof(int)); /*计算时空图*/ for(k=0; k<temp.size(); k++){ for(i=0; i<Row; i++){ for(j=0; j<Vol; j++){ if(Map[i][j]) Time[i][j+temp[k]] = k+1; } } }
这样就可以求出其禁止向量是(2,4,6) 。 我们用包含两个整数的数据结构组成的数组来存储这些预约表项: typedef struct route{ int step; T State; }; 在得到了所有的表项之后我们可以通过比较每个部件在移动多少位会得到 初中从而得出最原始的冲突向量。 在得到了初始的冲突向量之后,我们用逻辑右移器对冲突向量进行右移,每 当移动出一个 0 的时候就和原始的冲突向量做与运算, 然后得出的中间向量依然 进行如此的运算,直到没有新的向量出现为止。通过这个我们可以求出简单环。 这样求出图中的简单环这样就求出了怎样调度可以有无冲突的调度。 在求出了简单环之后我们通过简单环内的向量距离求出平均的距离,这样就 可以求出比较短的那一个作为调度用的向量。 最后将无冲突调度的时空图计算并打印出来。
相关文档
最新文档