00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 #ifndef pf_cache_INCLUDED
00132 #define pf_cache_INCLUDED
00133
00134 #include "config_targ.h"
00135 #include "config_cache.h"
00136 #include "config_lno.h"
00137 #include "wn.h"
00138 #include "pf_common.h"
00139
00140 class CACHE_PARAMETERS
00141 {
00142 CACHE_PARAMETERS (const CACHE_PARAMETERS&);
00143 CACHE_PARAMETERS* operator= (const CACHE_PARAMETERS&);
00144 MHD_LEVEL* _mhdptr[MHD_MAX_LEVELS];
00145 INT _num_levels;
00146 public:
00147 CACHE_PARAMETERS (void) {}
00148 ~CACHE_PARAMETERS (void) {}
00149 void Initialize () {
00150 INT i;
00151 _num_levels = 0;
00152 for (i=Mhd.First(); i!=-1; i=Mhd.Next(i)) {
00153 MHD_LEVEL* mhdp = &Mhd.L[i];
00154 if ( mhdp->Valid()
00155 && (mhdp->Type == MHD_TYPE_CACHE)
00156 && mhdp->Prefetch_Level )
00157 {
00158
00159 _mhdptr[_num_levels++] = mhdp;
00160 }
00161 }
00162 VB_PRINT (
00163 printf ("Cache specs (%d levels): Target Processor = %s\n",
00164 _num_levels, Targ_Name(Target));
00165 for (i=0; i<_num_levels; i++) {
00166 MHD_LEVEL* mhdp = _mhdptr[i];
00167 printf (" Level %3d cache: sz %7lld, eff_sz %7lld (cf=%2d), ln_sz %4d\n",
00168 i+1, mhdp->Size, LNO_Prefetch_Cache_Factor*(mhdp->Effective_Size),
00169 LNO_Prefetch_Cache_Factor, mhdp->Line_Size);
00170 });
00171 PF_PRINT(
00172 fprintf (TFile, "Cache specs (%d levels): Target Processor = %s\n",
00173 _num_levels, Targ_Name(Target));
00174 for (i=0; i<_num_levels; i++) {
00175 MHD_LEVEL* mhdp = _mhdptr[i];
00176 fprintf (TFile, " Level %3d cache: sz %7lld, eff_sz %7lld (cf=%2d), ln_sz %4d\n",
00177 i+1, mhdp->Size, LNO_Prefetch_Cache_Factor*(mhdp->Effective_Size),
00178 LNO_Prefetch_Cache_Factor, mhdp->Line_Size);
00179 });
00180 }
00181 INT LineSize (INT level) {
00182 if ((level == 0) || (level > _num_levels)) {
00183
00184 return 0;
00185 }
00186 return _mhdptr[level-1]->Line_Size;
00187 }
00188 INT64 EffSize (INT level) {
00189 if ((level == 0) || (level > _num_levels)) {
00190
00191 return 0;
00192 }
00193 return (LNO_Prefetch_Cache_Factor*(_mhdptr[level-1]->Effective_Size));
00194 }
00195 INT Levels () { return _num_levels; }
00196 BOOL Level1_Really_Level2 () {
00197
00198 if (Mhd.L[0].Prefetch_Level == FALSE) return TRUE;
00199
00200 if (Mhd.First() != 0) return TRUE;
00201 return FALSE;
00202 }
00203 void Print (FILE* fp) {
00204 INT i;
00205 fprintf (fp, "Cache has %d levels\n", _num_levels);
00206 for (i=0; i<_num_levels; i++) {
00207 _mhdptr[i]->Print (fp);
00208 }
00209 }
00210 };
00211 extern CACHE_PARAMETERS Cache;
00212
00213 class PF_VOLUME {
00214 PF_VOLUME* operator= (const PF_VOLUME&);
00215 public:
00216 UINT32 vol_1L;
00217 UINT32 vol_2L;
00218 PF_VOLUME () {
00219 vol_1L = 0;
00220 vol_2L = 0;
00221 }
00222 PF_VOLUME (const PF_VOLUME& vol) {
00223 vol_1L = vol.vol_1L;
00224 vol_2L = vol.vol_2L;
00225 }
00226 PF_VOLUME (INT vol_1, INT vol_2) {
00227 vol_1L = vol_1;
00228 vol_2L = vol_2;
00229 }
00230 ~PF_VOLUME (void) {}
00231 PF_VOLUME& operator *= (INT lines) {
00232 vol_1L *= lines;
00233 vol_2L *= lines;
00234 return *this;
00235 }
00236 PF_VOLUME& operator += (const PF_VOLUME& vol) {
00237 vol_1L += vol.vol_1L;
00238 vol_2L += vol.vol_2L;
00239 return *this;
00240 }
00241 BOOL Localized () {
00242 if (vol_1L <= Cache.EffSize(1)) return TRUE;
00243 if ((Cache.EffSize(2) > 0) && (vol_2L <= Cache.EffSize(2)))
00244 return TRUE;
00245 return FALSE;
00246 }
00247 BOOL Localized_1L () { return (vol_1L <= Cache.EffSize(1)); }
00248 BOOL Localized_2L () { return (vol_2L <= Cache.EffSize(2)); }
00249 void Print (FILE* fp) {
00250 fprintf (fp, "Vol: L1 %6d bytes", vol_1L);
00251 if (Cache.Levels()>1)
00252 fprintf (fp, ", L2 %6d bytes", vol_2L);
00253 fprintf (fp, "\n");
00254 }
00255 };
00256
00257 class PF_LOCLOOP {
00258 mINT16 _loop_1L;
00259 mINT16 _loop_2L;
00260 mINT16 _confidence_1L;
00261 mINT16 _confidence_2L;
00262 BOOL _while_temporal_1L;
00263 BOOL _while_temporal_2L;
00264 public:
00265 PF_LOCLOOP () {
00266 _loop_1L = _loop_2L = -1;
00267 _confidence_1L = _confidence_2L = 3;
00268 _while_temporal_1L = _while_temporal_2L = FALSE;
00269 }
00270 PF_LOCLOOP* operator= (const PF_LOCLOOP& locloop) {
00271 _loop_1L = locloop._loop_1L;
00272 _loop_2L = locloop._loop_2L;
00273 _confidence_1L = locloop._confidence_1L;
00274 _confidence_2L = locloop._confidence_2L;
00275 _while_temporal_1L = locloop._while_temporal_1L;
00276 _while_temporal_2L = locloop._while_temporal_2L;
00277 return this;
00278 }
00279
00280
00281
00282 BOOL Update (mINT16 depth, PF_VOLUME vol, mINT16 confidence) {
00283 BOOL updated = FALSE;
00284 switch (Cache.Levels()) {
00285 case 1:
00286 if ((_loop_1L == -1) && (vol.vol_1L < Cache.EffSize(1))) {
00287 _loop_1L = depth;
00288 _confidence_1L = confidence;
00289 updated = TRUE;
00290 }
00291 break;
00292 case 2:
00293
00294 Is_True ((_loop_1L == -1) || (_loop_2L != -1),
00295 ("Funny loop -- localized in L1 but not in L2\n"));
00296 if ((_loop_1L == -1) && (vol.vol_1L < Cache.EffSize(1))) {
00297 _loop_1L = depth;
00298 _confidence_1L = confidence;
00299 }
00300 if ((_loop_2L == -1) && (vol.vol_2L < Cache.EffSize(2))) {
00301 _loop_2L = depth;
00302 _confidence_2L = confidence;
00303 updated = TRUE;
00304 }
00305 break;
00306 default:
00307 Cache.Print(stdout);
00308 FmtAssert (0, ("Cache has (%d) more than 2 levels\n", Cache.Levels()));
00309 }
00310 return updated;
00311 }
00312 BOOL Localized () {
00313 return ((_loop_2L != -1) || (_loop_1L != -1));
00314 }
00315 BOOL Localized_1L () { return (_loop_1L != -1); }
00316 BOOL Localized_2L () { return (_loop_2L != -1); }
00317 mINT16 Loop_1L () const { return _loop_1L; }
00318 mINT16 Loop_2L () const { return _loop_2L; }
00319 mINT16 Confidence_1L () const { return _confidence_1L; }
00320 mINT16 Confidence_2L () const { return _confidence_2L; }
00321 BOOL While_Temporal_1L () const { return _while_temporal_1L; }
00322 BOOL While_Temporal_2L () const { return _while_temporal_2L; }
00323 void Set_While_Temporal_1L () { _while_temporal_1L = TRUE; }
00324 void Set_While_Temporal_2L () { _while_temporal_2L = TRUE; }
00325 void Print (FILE* fp) {
00326 fprintf (fp, "Localized loops: _1L --> %d (conf: %d%s)",
00327 _loop_1L, _confidence_1L,
00328 (_while_temporal_1L?" while-temporal":""));
00329 if (Cache.Levels()>1)
00330 fprintf (fp, ", _2L --> %d (conf: %d%s)", _loop_2L, _confidence_2L,
00331 (_while_temporal_2L?" while-temporal":""));
00332 fprintf (fp, "\n");
00333 }
00334 };
00335
00336 #endif // pf_cache_INCLUDED