單功能非線性流水線的最優調度的c語言實現

來源:互聯網
上載者:User

這是晚上圖書館回來時花的一些時間寫的,代碼的可讀性和效率實在差,但是絕對保證正確性。呵呵。如果你能看懂My Code那麼你一定閱讀代碼的頂級高手了啊 。呵呵。

 

 

 

 

下面是c代碼:

      
//你只要關注 FUCSEG,CYCTIM ,TimeSpaceDram//把他們初始化就好了啊。 #include<stdio.h>#include <conio.h> #include <stdlib.h> #define FUCSEG 5//這是你要關注的地方這是預約表中的 功能段 #define CYCTIM 9//這是你要關注的地方這是預約表中的 時間 #define STATESIZE 50#define STACKSIZE 44void dispather(int);int  pushconflict(int *stack,int *p,int c);int pop(int *stack,int *p);int empty(int *stack,int *p);void push(int *stack,int*p,int elem) ;int  pushconflict1(int *stack,int *p,int c);void stategy(int c1,int c2,int c0);int main(){ int temp0=0; int c0=0; int temp1=1; /*下面是你可以初始化的預約表啊。呵呵*/  int TimeSpaceDram[FUCSEG][CYCTIM]={{1,0,0,0,0,0,0,0,1},                                    {0,1,1,0,0,0,0,1,0},                                    {0,0,0,1,0,0,0,0,0},                                    {0,0,0,0,1,1,0,0,0},                                    {0,0,0,0,0,0,1,1,0}};//矩陣的時空圖,printf("\n下面是預約表\n") ;                                 for(int ye=0;ye<FUCSEG;ye++){        printf("\n"); for(int wu=0;wu<CYCTIM;wu++) printf("  %d  ",TimeSpaceDram[ye][wu]);} printf("\n"); /// int Conflict[CYCTIM]={0};  // matrix initionalization for(int i=0;i<FUCSEG;i++){         temp0=0;         int Assitance[CYCTIM]={0};         for(int j=0;j<CYCTIM;j++){                 if(TimeSpaceDram[i][j]!=0){                             Assitance[temp0]=j;                             temp0++;                                       }                                                             }         for(int k=temp0-1;k>0;k--)                 for(int m=0;m<k;m++)                         Conflict[Assitance[k]-Assitance[m]]=1;                } for(int ii=1;ii<CYCTIM;ii++){         c0+=Conflict[ii]*temp1;         temp1*=2;         }  dispather(c0); getchar();        return 0;    }void dispather(int c0){      int statecurse=1; int statec=0; int definestate=c0; int stack[STACKSIZE]={0}; int curse=0; int dispath[34]={0}; int dispathcurse=0;  int ccc=0;//位元c0相同的值為全一的  int state[STATESIZE]={0};//這個是用來儲存狀態的  for(int ppp=1;definestate>0;definestate/=2,ppp*=2)//計算值為全1的數            ccc+=ppp;statec=pushconflict(stack,&curse,c0);   state[0]=c0;   state[statecurse]=statec+2;   printf("\n下面是調度策略\n");   printf("格式:衝突向量--->(時間(若有兩個則表示或的關係即你可以任選一個繼續))--->衝突向量\n");   printf("下面的每一行都是一個調度策略,即是狀態轉移示意圖中的一個閉合迴路\n");while((empty(stack,&curse))!=0){int j=0;int ci=0;int discard;int operat=pop(stack,&curse);j=pop(stack,&curse);ci=(operat>>j)|c0;if(ci==ccc) ;      else{ if(ci==c0){  char   s[10];      for(int j=0;state[j]>0;j+=2) {          itoa(state[j],   s,   2);       //轉換成字串,進位基數為2         printf( "%s--->(",s);     //輸出         if(state[j+2]!=0)       stategy(state[j],state[j+2],c0);       else       stategy(state[j],c0,c0);        }        itoa(state[0],   s,   2);       //轉換成字串,進位基數為2         printf( "%s    \n",s);     //輸出        }else{ for(int j=0;j<STATESIZE;j+=2)  {        if(ci==state[j])        goto YE;        }statec=pushconflict(stack,&curse,ci);    state[statecurse+1]=ci;   state[statecurse+2]=statec;    statecurse+=2; YE:           ;                      }}WU:if(--(state[statecurse])<0){state[statecurse]=0;state[statecurse-1]=0;statecurse-=2; state[statecurse]--; if(state[statecurse]<0) goto WU;                     }}}      void push(int *stack,int*p,int elem){ stack[*p]=elem; (*p)++;    }int pop(int *stack,int *p){int temp;(*p)--;temp=stack[*p]; stack[*p]=0; return temp;   }int empty(int *stack,int *p){if( *p==0)return 0;return 1;  }int  pushconflict(int *stack,int *p,int c){ int t=1; int pp=0; int kk=c; while(c>0)  {  if(c%2==0)  {   push(stack,p,t);   push(stack,p,kk); pp++;}  t++;  c/=2;              }   return pp;}    int  pushconflict1(int *stack,int *p,int c){ int t=1; int pp=0; while(c>0)  {  if(c%2==0)  {   push(stack,p,t); pp++;}  t++;  c/=2;              }   return pp;}  void stategy(int c1,int c2,int c0){int stack[CYCTIM]={0};int curse=0;int operat=0;int j=0;int t= pushconflict1(stack,&curse,c1); for(;t>0;t--) {    j=pop(stack,&curse);   //printf("j=%d",j);   operat=c1;   if( c2==((operat>>j)|c0))        printf("%d,",j);                          }              printf(")--->");     }                                             

 

 

 

 

呵呵。你只要更改以上提示的地方就可以了啊。

我們再舉一個例子

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.