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 static const char source_file[] = __FILE__;
00038 static const char rcs_id[] = "$Source: /proj/osprey/CVS/open64/osprey1.0/common/targ_info/access/ti_res_count.c,v $ $Revision: 1.1.1.1 $";
00039
00040 #include <stdio.h>
00041 #include <math.h>
00042
00043 #include "defs.h"
00044 #include "erglob.h"
00045 #include "mempool.h"
00046 #include "topcode.h"
00047 #include "ti_si.h"
00048 #include "bstring.h"
00049 #include "ti_res_count.h"
00050
00051
00052
00053
00054 struct ti_res_count {
00055 INT32 bad_ii[SI_BAD_II_SET_MAX+1];
00056 double *vec;
00057 };
00058
00059
00060
00061 #define TI_RES_COUNT_bad_ii(r,i) ((r)->bad_ii[(i)])
00062 #define TI_RES_COUNT_vec(r,i) ((r)->vec[(i)])
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 TI_RES_COUNT *
00074 TI_RES_COUNT_Alloc(
00075 MEM_POOL *pool
00076 )
00077 {
00078 TI_RES_COUNT *counts = TYPE_MEM_POOL_ALLOC(TI_RES_COUNT, pool);
00079 counts->vec = TYPE_MEM_POOL_ALLOC_N(double, pool, SI_resource_count);
00080 if ( !MEM_POOL_Zeroed(pool) ) {
00081 BZERO(counts->vec, sizeof(double) * SI_resource_count);
00082 BZERO(counts->bad_ii, sizeof(counts->bad_ii));
00083 }
00084 return counts;
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 double
00097 TI_RES_COUNT_Min_Cycles(
00098 TI_RES_COUNT *res_counts
00099 )
00100 {
00101 INT32 i;
00102 double min_cycles = -1.0;
00103
00104 for ( i = 0; i < SI_resource_count; ++i ) {
00105 double this_min = TI_RES_COUNT_vec(res_counts,i)
00106 / SI_RESOURCE_ID_Avail_Per_Cycle(i);
00107
00108 if ( this_min > min_cycles ) min_cycles = this_min;
00109 }
00110 return min_cycles;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 INT32
00123 TI_RES_COUNT_Min_II(
00124 TI_RES_COUNT *res_counts
00125 )
00126 {
00127 INT32 min_ii;
00128
00129 for ( min_ii = ceil(TI_RES_COUNT_Min_Cycles(res_counts));
00130 min_ii <= SI_BAD_II_SET_MAX;
00131 ++min_ii
00132 ) {
00133 INT ops_with_bad_ii = TI_RES_COUNT_bad_ii(res_counts,min_ii);
00134
00135 Is_True(ops_with_bad_ii >= 0, ("negative count of OPs with bad II"));
00136 if ( ops_with_bad_ii == 0 ) break;
00137 }
00138
00139 return min_ii;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 void
00152 TI_RES_COUNT_Add_Op_Resources(
00153 TI_RES_COUNT *res_counts,
00154 TOP opcode
00155 )
00156 {
00157 INT i;
00158 TOP topcode = opcode;
00159 SI_BAD_II_SET bad_iis = TSI_Bad_IIs(topcode);
00160 SI_RESOURCE_TOTAL* rt_vec = TSI_Resource_Total_Vector(topcode);
00161
00162 for ( i = 0; i < TSI_Resource_Total_Vector_Size(topcode); ++i ) {
00163 SI_RESOURCE_ID id = SI_RESOURCE_TOTAL_Resource_Id(rt_vec+i);
00164 UINT count = SI_RESOURCE_TOTAL_Total_Used(rt_vec+i);
00165
00166 TI_RES_COUNT_vec(res_counts,id) += count;
00167 }
00168
00169 for ( i = SI_RR_Length(TSI_Resource_Requirement(topcode));
00170 i > 0;
00171 --i
00172 ) {
00173 if ( SI_BAD_II_SET_MemberP(bad_iis, i) ) {
00174 ++TI_RES_COUNT_bad_ii(res_counts, i);
00175 }
00176 }
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 void
00189 TI_RES_COUNT_Add_Op_Resources_Scaled(
00190 TI_RES_COUNT *res_counts,
00191 TOP opcode,
00192 double factor
00193 )
00194 {
00195 INT i;
00196 TOP topcode = opcode;
00197 SI_BAD_II_SET bad_iis = TSI_Bad_IIs(topcode);
00198 SI_RESOURCE_TOTAL *rt_vec = TSI_Resource_Total_Vector(topcode);
00199
00200 for ( i = 0; i < TSI_Resource_Total_Vector_Size(topcode); ++i ) {
00201 SI_RESOURCE_ID id = SI_RESOURCE_TOTAL_Resource_Id(rt_vec+i);
00202 UINT count = SI_RESOURCE_TOTAL_Total_Used(rt_vec+i);
00203
00204 TI_RES_COUNT_vec(res_counts,id) += count * factor;
00205 }
00206
00207 for ( i = SI_RR_Length(TSI_Resource_Requirement(topcode));
00208 i > 0;
00209 --i
00210 ) {
00211 if ( SI_BAD_II_SET_MemberP(bad_iis, i) ) {
00212 ++TI_RES_COUNT_bad_ii(res_counts, i);
00213 }
00214 }
00215 }
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 void
00227 TI_RES_COUNT_Subtract_Op_Resources(
00228 TI_RES_COUNT *res_counts,
00229 TOP opcode
00230 )
00231 {
00232 INT i;
00233 TOP topcode = opcode;
00234 SI_BAD_II_SET bad_iis = TSI_Bad_IIs(topcode);
00235 SI_RESOURCE_TOTAL *rt_vec = TSI_Resource_Total_Vector(topcode);
00236
00237 for ( i = 0; i < TSI_Resource_Total_Vector_Size(topcode); ++i ) {
00238 SI_RESOURCE_ID id = SI_RESOURCE_TOTAL_Resource_Id(rt_vec+i);
00239 UINT count = SI_RESOURCE_TOTAL_Total_Used(rt_vec+i);
00240
00241 TI_RES_COUNT_vec(res_counts,id) -= count;
00242 }
00243
00244 for ( i = SI_RR_Length(TSI_Resource_Requirement(topcode));
00245 i > 0;
00246 --i
00247 ) {
00248 if ( SI_BAD_II_SET_MemberP(bad_iis, i) ) {
00249 --TI_RES_COUNT_bad_ii(res_counts, i);
00250 }
00251 }
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 void
00264 TI_RES_COUNT_Subtract_Op_Resources_Scaled(
00265 TI_RES_COUNT *res_counts,
00266 TOP opcode,
00267 double factor
00268 )
00269 {
00270 INT i;
00271 TOP topcode = opcode;
00272 SI_BAD_II_SET bad_iis = TSI_Bad_IIs(topcode);
00273 SI_RESOURCE_TOTAL *rt_vec = TSI_Resource_Total_Vector(topcode);
00274
00275 for ( i = 0; i < TSI_Resource_Total_Vector_Size(topcode); ++i ) {
00276 SI_RESOURCE_ID id = SI_RESOURCE_TOTAL_Resource_Id(rt_vec+i);
00277 UINT count = SI_RESOURCE_TOTAL_Total_Used(rt_vec+i);
00278
00279 TI_RES_COUNT_vec(res_counts,id) -= count * factor;
00280 }
00281
00282 for ( i = SI_RR_Length(TSI_Resource_Requirement(topcode));
00283 i > 0;
00284 --i
00285 ) {
00286 if ( SI_BAD_II_SET_MemberP(bad_iis, i) ) {
00287 --TI_RES_COUNT_bad_ii(res_counts, i);
00288 }
00289 }
00290 }
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301 void
00302 TI_RES_COUNT_Add(
00303 TI_RES_COUNT *sum,
00304 TI_RES_COUNT *addend1,
00305 TI_RES_COUNT *addend2
00306 )
00307 {
00308 const INT length = SI_resource_count;
00309 INT i;
00310
00311 for (i = 0; i < length; i++) {
00312 TI_RES_COUNT_vec(sum,i) = TI_RES_COUNT_vec(addend1,i)
00313 + TI_RES_COUNT_vec(addend2,i);
00314 }
00315
00316 for (i = 0; i <= SI_BAD_II_SET_MAX; i++) {
00317 TI_RES_COUNT_bad_ii(sum,i) = TI_RES_COUNT_bad_ii(addend1,i)
00318 + TI_RES_COUNT_bad_ii(addend2,i);
00319 }
00320 }
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331 void
00332 TI_RES_COUNT_Subtract(
00333 TI_RES_COUNT *difference,
00334 TI_RES_COUNT *minuend,
00335 TI_RES_COUNT *subtrahend
00336 )
00337 {
00338 const INT length = SI_resource_count;
00339 INT i;
00340
00341 for (i = 0; i < length; i++) {
00342 TI_RES_COUNT_vec(difference,i) = TI_RES_COUNT_vec(minuend,i)
00343 - TI_RES_COUNT_vec(subtrahend,i);
00344 }
00345
00346 for (i = 0; i <= SI_BAD_II_SET_MAX; i++) {
00347 TI_RES_COUNT_bad_ii(difference,i) = TI_RES_COUNT_bad_ii(minuend,i)
00348 - TI_RES_COUNT_bad_ii(subtrahend,i);
00349 }
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 void
00362 TI_RES_COUNT_Print(
00363 FILE *fp,
00364 TI_RES_COUNT *res
00365 )
00366 {
00367 BOOL first = TRUE;
00368 SI_RESOURCE_ID i;
00369
00370 fprintf(fp, "TI_RES_COUNT(");
00371 for (i = 0; i < SI_resource_count; i++) {
00372 if (TI_RES_COUNT_vec(res, i) > 0.0) {
00373 if (!first) fprintf(fp, ", ");
00374 fprintf(fp, "%s %G", SI_RESOURCE_ID_Name(i), TI_RES_COUNT_vec(res, i));
00375 if (SI_RESOURCE_ID_Avail_Per_Cycle(i) > 1)
00376 fprintf(fp, "/%d", SI_RESOURCE_ID_Avail_Per_Cycle(i));
00377 first = FALSE;
00378 }
00379 }
00380 fprintf(fp, ")");
00381 fflush(fp);
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393 void
00394 TI_RES_COUNT_Emit_Note(
00395 const char *prefix,
00396 FILE *fp,
00397 TI_RES_COUNT *res,
00398 INT ii
00399 )
00400 {
00401 SI_RESOURCE_ID i;
00402 for (i = 0; i < SI_resource_count; i++) {
00403 if (TI_RES_COUNT_vec(res, i) > 0.0 && SI_RESOURCE_ID_Avail_Per_Cycle(i) > 0) {
00404 INT usage = TI_RES_COUNT_vec(res, i) * 100.0 / (SI_RESOURCE_ID_Avail_Per_Cycle(i) * ii);
00405 fprintf(fp, "%s%d %s units ( %d%% of peak )\n",
00406 prefix, (INT) TI_RES_COUNT_vec(res, i), SI_RESOURCE_ID_Name(i), usage);
00407 }
00408 }
00409 }