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 #include <unistd.h>
00037 #include <stdlib.h>
00038 #include <stdarg.h>
00039 #include <string.h>
00040 #include "omp_rtl.h"
00041
00042
00043 ompc_lock_t _ompc_thread_lock;
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 extern volatile int __omp_level_1_exit_count;
00089 void
00090 __ompc_static_init_4 (omp_int32 global_tid, omp_sched_t schedtype,
00091 omp_int32 *plower,
00092 omp_int32 *pupper, omp_int32 *pstride,
00093 omp_int32 incr, omp_int32 chunk)
00094 {
00095 omp_int32 my_lower, my_upper;
00096 omp_int32 block_size;
00097 omp_int32 team_size;
00098 omp_int32 trip_count;
00099 omp_int32 adjustment;
00100 omp_int32 stride;
00101 omp_v_thread_t *p_vthread;
00102
00103
00104 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL) {
00105
00106 block_size = (incr > 0) ? (*pupper - *plower + 1) :
00107 (*pupper - *plower - 1);
00108
00109 *pstride = block_size;
00110
00111 return;
00112 }
00113
00114 p_vthread = __ompc_get_v_thread_by_num(global_tid);
00115 team_size = p_vthread->team_size;
00116 if (team_size == 1) {
00117
00118 block_size = (incr > 0) ? (*pupper - *plower - 1) :
00119 (*pupper - *plower + 1);
00120
00121 *pstride = block_size;
00122
00123 return;
00124 }
00125
00126
00127
00128
00129
00130 if (schedtype == OMP_SCHED_STATIC_EVEN) {
00131
00132 trip_count = (*pupper - *plower) / incr + 1;
00133
00134 adjustment = ((trip_count % team_size) == 0) ? -1 : 0;
00135 block_size = (trip_count / team_size + adjustment) * incr;
00136 stride = (trip_count / team_size + adjustment + 1) * incr;
00137
00138 my_lower = *plower + global_tid * stride;
00139 my_upper = my_lower + block_size;
00140
00141 *plower = my_lower;
00142 *pupper = my_upper;
00143
00144 return;
00145 } else {
00146 Is_Valid( chunk > 0, ("chunk size must be a positive number"));
00147
00148 block_size = (chunk - 1) * incr;
00149 stride = chunk * incr;
00150 my_lower = *plower + global_tid * stride;
00151 my_upper = my_lower + block_size;
00152
00153 *plower = my_lower;
00154 *pupper = my_upper;
00155 *pstride = stride * team_size;
00156
00157 return;
00158 }
00159 }
00160
00161
00162
00163 void
00164 __ompc_static_init_8 (omp_int32 global_tid, omp_sched_t schedtype,
00165 omp_int64 *plower,
00166 omp_int64 *pupper, omp_int64 *pstride,
00167 omp_int64 incr, omp_int64 chunk)
00168 {
00169 omp_int64 my_lower, my_upper;
00170 omp_int64 block_size;
00171 omp_int64 team_size;
00172 omp_int64 trip_count;
00173 omp_int64 adjustment;
00174 omp_int64 stride;
00175 omp_v_thread_t *p_vthread;
00176
00177 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL) {
00178
00179 block_size = (incr > 0) ? (*pupper - *plower + 1) :
00180 (*pupper - *plower - 1);
00181
00182 *pstride = block_size;
00183
00184 return;
00185 }
00186
00187 p_vthread = __ompc_get_v_thread_by_num(global_tid);
00188 team_size = p_vthread->team_size;
00189 if (team_size == 1) {
00190
00191 block_size = (incr > 0) ? (*pupper - *plower + 1) :
00192 (*pupper - *plower - 1);
00193
00194 *pstride = block_size;
00195
00196 return;
00197 }
00198
00199
00200
00201
00202
00203 if (schedtype == OMP_SCHED_STATIC_EVEN) {
00204
00205 trip_count = (*pupper - *plower) / incr + 1;
00206
00207 adjustment = ((trip_count % team_size) == 0) ? -1 : 0;
00208 block_size = (trip_count / team_size + adjustment) * incr;
00209 stride = (trip_count / team_size + adjustment + 1) * incr;
00210
00211 my_lower = *plower + global_tid * stride;
00212 my_upper = my_lower + block_size;
00213
00214 *plower = my_lower;
00215 *pupper = my_upper;
00216
00217 return;
00218 } else {
00219 Is_Valid( chunk > 0, ("chunk size must be a positive number"));
00220
00221 block_size = (chunk - 1) * incr;
00222 stride = chunk * incr;
00223 my_lower = *plower + global_tid * stride;
00224 my_upper = my_lower + block_size;
00225
00226 *plower = my_lower;
00227 *pupper = my_upper;
00228 *pstride = stride * team_size;
00229
00230 return;
00231 }
00232 }
00233
00234 void
00235 __ompc_static_fini (omp_int32 global_tid)
00236 {
00237
00238 }
00239
00240
00241
00242
00243 int
00244 __ompc_is_ordered (omp_sched_t schedtype)
00245 {
00246 switch(schedtype)
00247 {
00248 case OMP_SCHED_STATIC_EVEN:
00249 case OMP_SCHED_STATIC:
00250 case OMP_SCHED_DYNAMIC:
00251 case OMP_SCHED_GUIDED:
00252 case OMP_SCHED_RUNTIME:
00253 case OMP_SCHED_UNKNOWN:
00254 return 0;
00255 break;
00256 case OMP_SCHED_ORDERED_STATIC_EVEN:
00257 case OMP_SCHED_ORDERED_STATIC:
00258 case OMP_SCHED_ORDERED_DYNAMIC:
00259 case OMP_SCHED_ORDERED_GUIDED:
00260 case OMP_SCHED_ORDERED_RUNTIME:
00261 return 1;
00262 break;
00263 default:
00264 return 0;
00265 }
00266 }
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 void
00285 __ompc_scheduler_init_4 (omp_int32 global_tid, omp_sched_t schedtype,
00286 omp_int32 lower, omp_int32 upper,
00287 omp_int32 stride, omp_int32 chunk)
00288 {
00289 omp_team_t *p_team;
00290 omp_v_thread_t *p_vthread;
00291
00292
00293 if (schedtype == OMP_SCHED_RUNTIME) {
00294
00295 schedtype = __omp_rt_sched_type;
00296 chunk = __omp_rt_sched_size;
00297
00298 } else if (schedtype == OMP_SCHED_ORDERED_RUNTIME) {
00299 schedtype = __omp_rt_sched_type + OMP_SCHED_ORDERED_GAP;
00300 chunk = __omp_rt_sched_size;
00301 }
00302
00303 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL) {
00304
00305 __omp_root_team.loop_lower_bound = lower;
00306 __omp_root_team.loop_upper_bound = upper;
00307 __omp_root_team.loop_increament = stride;
00308
00309 __omp_root_team.schedule_count = 0;
00310 return;
00311 } else if (__omp_exe_mode & OMP_EXE_MODE_NORMAL) {
00312 p_team = &__omp_level_1_team_manager;
00313 p_vthread = &__omp_level_1_team[global_tid];
00314 } else {
00315 p_vthread = __ompc_get_v_thread_by_num(global_tid);
00316 p_team = p_vthread->team;
00317 }
00318 p_vthread->schedule_count = 0;
00319
00320 if (p_team->team_size == 1) {
00321 p_team->loop_lower_bound = lower;
00322 p_team->loop_upper_bound = upper;
00323 p_team->loop_increament = stride;
00324 p_team->schedule_count = 0;
00325 if (__ompc_is_ordered(schedtype))
00326 p_team->ordered_count = 0;
00327
00328
00329 return;
00330
00331 }
00332
00333
00334
00335
00336
00337 p_vthread->loop_count++;
00338
00339 __ompc_lock(&(p_team->schedule_lock));
00340 if (p_team->loop_count >= p_vthread->loop_count) {
00341
00342 __ompc_unlock(&(p_team->schedule_lock));
00343 return;
00344 } else {
00345
00346
00347 p_team->loop_lower_bound = lower;
00348 p_team->loop_upper_bound = upper;
00349 p_team->loop_increament = stride;
00350 p_team->schedule_type = schedtype;
00351 p_team->chunk_size = chunk;
00352 p_team->schedule_count = 0;
00353 if (__ompc_is_ordered(schedtype))
00354 p_team->ordered_count = 0;
00355
00356 p_team->loop_count++;
00357
00358 __ompc_unlock(&(p_team->schedule_lock));
00359
00360 return;
00361 }
00362 }
00363
00364
00365 void
00366 __ompc_scheduler_init_8 (omp_int32 global_tid, omp_sched_t schedtype,
00367 omp_int64 lower, omp_int64 upper,
00368 omp_int64 stride, omp_int64 chunk)
00369 {
00370 omp_team_t *p_team;
00371 omp_v_thread_t *p_vthread;
00372
00373
00374 if (schedtype == OMP_SCHED_RUNTIME) {
00375
00376 schedtype = __omp_rt_sched_type;
00377 chunk = __omp_rt_sched_size;
00378 } else if (schedtype == OMP_SCHED_ORDERED_RUNTIME) {
00379 schedtype = __omp_rt_sched_type + OMP_SCHED_ORDERED_GAP;
00380 chunk = __omp_rt_sched_size;
00381 }
00382
00383 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL) {
00384
00385 __omp_root_team.loop_lower_bound = lower;
00386 __omp_root_team.loop_upper_bound = upper;
00387 __omp_root_team.loop_increament = stride;
00388
00389 __omp_root_team.schedule_count = 0;
00390 return;
00391 } else if (__omp_exe_mode & OMP_EXE_MODE_NORMAL) {
00392 p_team = &__omp_level_1_team_manager;
00393 p_vthread = &__omp_level_1_team[global_tid];
00394 } else {
00395 p_vthread = __ompc_get_v_thread_by_num(global_tid);
00396 p_team = p_vthread->team;
00397 }
00398 p_vthread->schedule_count = 0;
00399
00400 if (p_team->team_size == 1) {
00401 p_team->loop_lower_bound = lower;
00402 p_team->loop_upper_bound = upper;
00403 p_team->loop_increament = stride;
00404 p_team->schedule_count = 0;
00405 if (__ompc_is_ordered(schedtype))
00406 p_team->ordered_count = 0;
00407
00408
00409 return;
00410
00411 }
00412
00413
00414
00415
00416
00417 p_vthread->loop_count++;
00418
00419 __ompc_lock(&(p_team->schedule_lock));
00420 if (p_team->loop_count >= p_vthread->loop_count) {
00421
00422 __ompc_unlock(&(p_team->schedule_lock));
00423 return;
00424 } else {
00425
00426
00427 p_team->loop_lower_bound = lower;
00428 p_team->loop_upper_bound = upper;
00429 p_team->loop_increament = stride;
00430 p_team->schedule_type = schedtype;
00431 p_team->chunk_size = chunk;
00432 p_team->schedule_count = 0;
00433 if (__ompc_is_ordered(schedtype))
00434 p_team->ordered_count = 0;
00435
00436 p_team->loop_count++;
00437
00438 __ompc_unlock(&(p_team->schedule_lock));
00439
00440 return;
00441 }
00442 }
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458 omp_int32 __ompc_schedule_next_4 (omp_int32 global_tid,
00459 omp_int32 *plower,
00460 omp_int32 *pupper, omp_int32 *pstride)
00461 {
00462 omp_team_t *p_team;
00463 omp_v_thread_t *p_vthread;
00464 omp_int32 team_size;
00465 omp_int32 trip_count;
00466 omp_int32 adjustment;
00467 omp_int32 block_size;
00468 omp_int32 stride;
00469 omp_int32 chunk;
00470 omp_int32 incr;
00471 omp_int32 my_lower, my_upper;
00472 omp_int32 global_lower, global_upper;
00473 omp_int32 my_trip, schedule_count;
00474 float trip_flag;
00475
00476 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL) {
00477
00478 if ( __omp_root_team.schedule_count != 0) {
00479
00480 return 0;
00481 }
00482
00483 __omp_root_team.schedule_count = 1;
00484
00485 *plower = __omp_root_team.loop_lower_bound;
00486 *pupper = __omp_root_team.loop_upper_bound;
00487
00488 *pstride = __omp_root_team.loop_increament;
00489
00490 __omp_root_v_thread.ordered_count = 0;
00491
00492 return 1;
00493 }
00494
00495 if (__omp_exe_mode & OMP_EXE_MODE_NORMAL) {
00496 p_vthread = &__omp_level_1_team[global_tid];
00497 p_team = &__omp_level_1_team_manager;
00498 } else {
00499 p_vthread = __ompc_get_v_thread_by_num(global_tid);
00500 p_team = p_vthread->team;
00501 }
00502
00503 team_size = p_team->team_size;
00504 if (team_size == 1) {
00505
00506
00507 if (p_team->schedule_count != 0) {
00508
00509 return 0;
00510 }
00511 p_team->schedule_count = 1;
00512
00513 *plower = p_team->loop_lower_bound;
00514 *pupper = p_team->loop_upper_bound;
00515
00516 *pstride = p_team->loop_increament;
00517 p_vthread->ordered_count = 0;
00518
00519 return 1;
00520 }
00521
00522
00523 switch (p_team->schedule_type) {
00524 case OMP_SCHED_STATIC_EVEN:
00525
00526 if (p_vthread->schedule_count != 0) {
00527
00528 return 0;
00529 }
00530 global_lower = p_team->loop_lower_bound;
00531 global_upper = p_team->loop_upper_bound;
00532 incr = p_team->loop_increament;
00533 trip_count = (global_upper - global_lower) / incr + 1;
00534
00535 adjustment = ((trip_count % team_size) == 0) ? -1 : 0;
00536 block_size = (trip_count / team_size + adjustment) * incr;
00537 stride = (trip_count / team_size + adjustment + 1) * incr;
00538
00539 my_lower = global_lower + global_tid * stride;
00540 my_upper = my_lower + block_size;
00541 *plower = my_lower;
00542 *pupper = my_upper;
00543
00544 *pstride = incr;
00545
00546 p_vthread->schedule_count = 1;
00547
00548 if (trip_count >= team_size) {
00549 return 1;
00550 } else {
00551 if (global_tid <= (trip_count - 1))
00552 return 1;
00553 else
00554 return 0;
00555 }
00556
00557 return 1;
00558 break;
00559 case OMP_SCHED_STATIC:
00560
00561
00562
00563 global_lower = p_team->loop_lower_bound;
00564 global_upper = p_team->loop_upper_bound;
00565 incr = p_team->loop_increament;
00566 chunk = p_team->chunk_size;
00567
00568 trip_count = (global_upper - global_lower) / incr + 1;
00569
00570 block_size = (chunk - 1) * incr;
00571 stride = chunk * incr;
00572
00573
00574 my_trip = p_vthread->schedule_count * chunk * team_size
00575 + global_tid * chunk + 1;
00576
00577 if ( my_trip > trip_count ) {
00578
00579 return 0;
00580 }
00581 adjustment = p_vthread->schedule_count * stride * team_size;
00582 p_vthread->schedule_count += 1;
00583
00584 my_lower = global_lower + global_tid * stride + adjustment;
00585 my_upper = my_lower + block_size;
00586
00587 *plower = my_lower;
00588 *pupper = my_upper;
00589
00590 *pstride = incr;
00591 return 1;
00592 break;
00593 case OMP_SCHED_GUIDED:
00594 __ompc_lock(&(p_team->schedule_lock));
00595
00596 global_lower = p_team->loop_lower_bound;
00597 global_upper = p_team->loop_upper_bound;
00598 incr = p_team->loop_increament;
00599 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
00600 trip_count = (global_upper - global_lower) / incr ;
00601
00602 if ( trip_flag < 0) {
00603 __ompc_unlock(&(p_team->schedule_lock));
00604
00605 return 0;
00606 }
00607
00608 trip_count += 1;
00609 my_lower = global_lower;
00610 block_size = trip_count / team_size;
00611 chunk = p_team->chunk_size;
00612 if (block_size > chunk)
00613 chunk = block_size;
00614 my_upper = my_lower + (chunk - 1) * incr;
00615 p_team->loop_lower_bound = my_lower + chunk * incr;
00616
00617 __ompc_unlock(&(p_team->schedule_lock));
00618
00619 *plower = my_lower;
00620 *pupper = my_upper;
00621 *pstride = incr;
00622 return 1;
00623 break;
00624
00625 case OMP_SCHED_DYNAMIC:
00626 __ompc_lock(&(p_team->schedule_lock));
00627
00628 global_lower = p_team->loop_lower_bound;
00629 global_upper = p_team->loop_upper_bound;
00630 incr = p_team->loop_increament;
00631 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
00632 trip_count = (global_upper - global_lower) / incr;
00633
00634
00635 if ( trip_flag < 0) {
00636 __ompc_unlock(&(p_team->schedule_lock));
00637
00638 return 0;
00639 }
00640
00641 trip_count += 1;
00642 my_lower = global_lower;
00643 chunk = p_team->chunk_size;
00644 my_upper = my_lower + (chunk - 1) * incr;
00645 p_team->loop_lower_bound = my_lower + chunk * incr;
00646
00647 __ompc_unlock(&(p_team->schedule_lock));
00648
00649 *plower = my_lower;
00650 *pupper = my_upper;
00651 *pstride = incr;
00652 return 1;
00653 break;
00654 case OMP_SCHED_ORDERED_STATIC_EVEN:
00655
00656 if (p_vthread->schedule_count != 0) {
00657
00658 return 0;
00659 }
00660 global_lower = p_team->loop_lower_bound;
00661 global_upper = p_team->loop_upper_bound;
00662 incr = p_team->loop_increament;
00663 trip_count = (global_upper - global_lower) / incr + 1;
00664
00665 adjustment = ((trip_count % team_size) == 0) ? -1 : 0;
00666 block_size = (trip_count / team_size + adjustment) * incr;
00667 stride = (trip_count / team_size + adjustment + 1) * incr;
00668
00669 my_lower = global_lower + global_tid * stride;
00670 my_upper = my_lower + block_size;
00671 *plower = my_lower;
00672 *pupper = my_upper;
00673
00674 *pstride = incr;
00675
00676 p_vthread->schedule_count = 1;
00677 p_vthread->ordered_count = global_tid;
00678 p_vthread->rest_iter_count = (my_upper - my_lower) / incr + 1;
00679
00680 if (trip_count >= team_size) {
00681 return 1;
00682 } else {
00683 if (global_tid <= (trip_count - 1))
00684 return 1;
00685 else
00686 return 0;
00687 }
00688
00689 return 1;
00690 break;
00691 case OMP_SCHED_ORDERED_STATIC:
00692
00693
00694
00695 global_lower = p_team->loop_lower_bound;
00696 global_upper = p_team->loop_upper_bound;
00697 incr = p_team->loop_increament;
00698 chunk = p_team->chunk_size;
00699
00700 trip_count = (global_upper - global_lower) / incr + 1;
00701
00702 block_size = (chunk - 1) * incr;
00703 stride = chunk * incr;
00704
00705
00706
00707
00708 my_trip = p_vthread->schedule_count * chunk * team_size
00709 + global_tid * chunk + 1;
00710
00711 if ( my_trip > trip_count ) {
00712
00713 return 0;
00714 }
00715 adjustment = p_vthread->schedule_count * stride * team_size;
00716 p_vthread->ordered_count = p_vthread->schedule_count * team_size
00717 + global_tid;
00718 p_vthread->schedule_count += 1;
00719 p_vthread->rest_iter_count = chunk;
00720
00721 my_lower = global_lower + global_tid * stride + adjustment;
00722 my_upper = my_lower + block_size;
00723
00724 *plower = my_lower;
00725 *pupper = my_upper;
00726
00727 *pstride = incr;
00728 return 1;
00729
00730 break;
00731 case OMP_SCHED_ORDERED_DYNAMIC:
00732 __ompc_lock(&(p_team->schedule_lock));
00733
00734 global_lower = p_team->loop_lower_bound;
00735 global_upper = p_team->loop_upper_bound;
00736 incr = p_team->loop_increament;
00737 schedule_count = p_team->schedule_count;
00738 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
00739
00740 if ( trip_flag < 0) {
00741 __ompc_unlock(&(p_team->schedule_lock));
00742
00743 return 0;
00744 }
00745 my_lower = global_lower;
00746 chunk = p_team->chunk_size;
00747
00748 p_team->loop_lower_bound = my_lower + chunk * incr;
00749 p_team->schedule_count++;
00750
00751 __ompc_unlock(&(p_team->schedule_lock));
00752
00753 trip_count = (global_upper - global_lower) / incr + 1;
00754 my_upper = my_lower + (chunk - 1) * incr;
00755
00756 p_vthread->ordered_count = schedule_count;
00757 p_vthread->rest_iter_count = chunk;
00758
00759 *plower = my_lower;
00760 *pupper = my_upper;
00761 *pstride = incr;
00762 return 1;
00763 break;
00764 case OMP_SCHED_ORDERED_GUIDED:
00765 __ompc_lock(&(p_team->schedule_lock));
00766
00767 global_lower = p_team->loop_lower_bound;
00768 global_upper = p_team->loop_upper_bound;
00769 incr = p_team->loop_increament;
00770 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
00771 trip_count = (global_upper - global_lower) / incr ;
00772 schedule_count = p_team->schedule_count;
00773
00774 if ( trip_flag < 0)
00775 {
00776 __ompc_unlock(&(p_team->schedule_lock));
00777
00778 return 0;
00779 }
00780 trip_count += 1;
00781 my_lower = global_lower;
00782 block_size = trip_count / team_size;
00783 chunk = p_team->chunk_size;
00784 if (block_size > chunk)
00785 chunk = block_size;
00786 my_upper = my_lower + (chunk - 1) * incr;
00787 p_team->loop_lower_bound = my_lower + chunk * incr;
00788 p_team->schedule_count +=1;
00789
00790 __ompc_unlock(&(p_team->schedule_lock));
00791
00792 p_vthread->ordered_count = schedule_count;
00793 p_vthread->rest_iter_count = chunk;
00794
00795 *plower = my_lower;
00796 *pupper = my_upper;
00797 *pstride = incr;
00798 return 1;
00799 break;
00800 default:
00801
00802 Not_Valid(" unknown schedule type specified");
00803 }
00804
00805 return 0;
00806 }
00807
00808
00809 omp_int32 __ompc_schedule_next_8 (omp_int32 global_tid,
00810 omp_int64 *plower,
00811 omp_int64 *pupper, omp_int64 *pstride)
00812 {
00813 omp_team_t *p_team;
00814 omp_v_thread_t *p_vthread;
00815 omp_int32 team_size;
00816 omp_int64 trip_count;
00817 omp_int64 adjustment;
00818 omp_int64 block_size;
00819 omp_int64 stride;
00820 omp_int64 chunk;
00821 omp_int64 incr;
00822 omp_int64 my_lower, my_upper;
00823 omp_int64 global_lower, global_upper;
00824 omp_int64 my_trip, schedule_count;
00825 float trip_flag;
00826
00827 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL) {
00828
00829 if ( __omp_root_team.schedule_count != 0) {
00830
00831 return 0;
00832 }
00833 __omp_root_team.schedule_count = 1;
00834
00835 *plower = __omp_root_team.loop_lower_bound;
00836 *pupper = __omp_root_team.loop_upper_bound;
00837
00838 *pstride = __omp_root_team.loop_increament;
00839
00840 __omp_root_v_thread.ordered_count = 0;
00841
00842 return 0;
00843 }
00844
00845 if (__omp_exe_mode & OMP_EXE_MODE_NORMAL) {
00846 p_vthread = &__omp_level_1_team[global_tid];
00847 p_team = &__omp_level_1_team_manager;
00848 } else {
00849 p_vthread = __ompc_get_v_thread_by_num(global_tid);
00850 p_team = p_vthread->team;
00851 }
00852
00853 team_size = p_team->team_size;
00854 if (team_size == 1) {
00855
00856
00857 if (p_team->schedule_count != 0) {
00858
00859 return 0;
00860 }
00861 p_team->schedule_count = 1;
00862
00863 *plower = p_team->loop_lower_bound;
00864 *pupper = p_team->loop_upper_bound;
00865
00866 *pstride = p_team->loop_increament;
00867 p_vthread->ordered_count = 0;
00868
00869 return 0;
00870 }
00871
00872
00873 switch (p_team->schedule_type) {
00874 case OMP_SCHED_STATIC_EVEN:
00875
00876 if (p_vthread->schedule_count != 0) {
00877
00878 return 0;
00879 }
00880 global_lower = p_team->loop_lower_bound;
00881 global_upper = p_team->loop_upper_bound;
00882 incr = p_team->loop_increament;
00883 trip_count = (global_upper - global_lower) / incr + 1;
00884
00885 adjustment = ((trip_count % team_size) == 0) ? -1 : 0;
00886 block_size = (trip_count / team_size + adjustment) * incr;
00887 stride = (trip_count / team_size + adjustment + 1) * incr;
00888
00889 my_lower = global_lower + global_tid * stride;
00890 my_upper = my_lower + block_size;
00891 *plower = my_lower;
00892 *pupper = my_upper;
00893
00894 *pstride = incr;
00895
00896 p_vthread->schedule_count = 1;
00897
00898 if (trip_count >= team_size) {
00899 return 1;
00900 } else {
00901 if (global_tid <= (trip_count - 1))
00902 return 1;
00903 else
00904 return 0;
00905 }
00906
00907 return 1;
00908 break;
00909 case OMP_SCHED_STATIC:
00910
00911
00912
00913 global_lower = p_team->loop_lower_bound;
00914 global_upper = p_team->loop_upper_bound;
00915 incr = p_team->loop_increament;
00916 chunk = p_team->chunk_size;
00917
00918 trip_count = (global_upper - global_lower) / incr + 1;
00919
00920 block_size = (chunk - 1) * incr;
00921 stride = chunk * incr;
00922
00923
00924
00925
00926 my_trip = p_vthread->schedule_count * chunk * team_size
00927 + global_tid * chunk + 1;
00928
00929 if ( my_trip > trip_count ) {
00930
00931 return 0;
00932 }
00933 adjustment = p_vthread->schedule_count * stride * team_size;
00934 p_vthread->schedule_count += 1;
00935
00936 my_lower = global_lower + global_tid * stride + adjustment;
00937 my_upper = my_lower + block_size;
00938
00939 *plower = my_lower;
00940 *pupper = my_upper;
00941
00942 *pstride = incr;
00943 return 1;
00944 break;
00945 case OMP_SCHED_GUIDED:
00946 __ompc_lock(&(p_team->schedule_lock));
00947
00948 global_lower = p_team->loop_lower_bound;
00949 global_upper = p_team->loop_upper_bound;
00950 incr = p_team->loop_increament;
00951 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
00952 trip_count = (global_upper - global_lower) / incr ;
00953
00954 if ( trip_flag < 0) {
00955 __ompc_unlock(&(p_team->schedule_lock));
00956
00957 return 0;
00958 }
00959 trip_count += 1;
00960 my_lower = global_lower;
00961 block_size = trip_count / team_size;
00962 chunk = p_team->chunk_size;
00963 if (block_size > chunk)
00964 chunk = block_size;
00965 my_upper = my_lower + (chunk - 1) * incr;
00966 p_team->loop_lower_bound = my_lower + chunk * incr;
00967
00968 __ompc_unlock(&(p_team->schedule_lock));
00969
00970 *plower = my_lower;
00971 *pupper = my_upper;
00972 *pstride = incr;
00973 return 1;
00974
00975 break;
00976 case OMP_SCHED_DYNAMIC:
00977 __ompc_lock(&(p_team->schedule_lock));
00978
00979 global_lower = p_team->loop_lower_bound;
00980 global_upper = p_team->loop_upper_bound;
00981 incr = p_team->loop_increament;
00982 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
00983 trip_count = (global_upper - global_lower) / incr;
00984
00985 if ( trip_flag < 0) {
00986 __ompc_unlock(&(p_team->schedule_lock));
00987
00988 return 0;
00989 }
00990 trip_count += 1;
00991 my_lower = global_lower;
00992 chunk = p_team->chunk_size;
00993 my_upper = my_lower + (chunk - 1) * incr;
00994 p_team->loop_lower_bound = my_lower + chunk * incr;
00995
00996 __ompc_unlock(&(p_team->schedule_lock));
00997
00998 *plower = my_lower;
00999 *pupper = my_upper;
01000 *pstride = incr;
01001 return 1;
01002
01003 break;
01004 case OMP_SCHED_ORDERED_STATIC_EVEN:
01005
01006 if (p_vthread->schedule_count != 0) {
01007
01008 return 0;
01009 }
01010 global_lower = p_team->loop_lower_bound;
01011 global_upper = p_team->loop_upper_bound;
01012 incr = p_team->loop_increament;
01013 trip_count = (global_upper - global_lower) / incr + 1;
01014
01015 adjustment = ((trip_count % team_size) == 0) ? -1 : 0;
01016 block_size = (trip_count / team_size + adjustment) * incr;
01017 stride = (trip_count / team_size + adjustment + 1) * incr;
01018
01019 my_lower = global_lower + global_tid * stride;
01020 my_upper = my_lower + block_size;
01021 *plower = my_lower;
01022 *pupper = my_upper;
01023
01024 *pstride = incr;
01025
01026 p_vthread->schedule_count = 1;
01027 p_vthread->ordered_count = global_tid;
01028 p_vthread->rest_iter_count = (my_upper - my_lower) / incr + 1;
01029
01030 if (trip_count >= team_size) {
01031 return 1;
01032 } else {
01033 if (global_tid <= (trip_count - 1))
01034 return 1;
01035 else
01036 return 0;
01037 }
01038
01039 return 1;
01040 break;
01041 case OMP_SCHED_ORDERED_STATIC:
01042
01043
01044
01045 global_lower = p_team->loop_lower_bound;
01046 global_upper = p_team->loop_upper_bound;
01047 incr = p_team->loop_increament;
01048 chunk = p_team->chunk_size;
01049
01050 trip_count = (global_upper - global_lower) / incr + 1;
01051
01052 block_size = (chunk - 1) * incr;
01053 stride = chunk * incr;
01054
01055
01056
01057 my_trip = p_vthread->schedule_count * chunk * team_size
01058 + global_tid * chunk + 1;
01059
01060 if ( my_trip > trip_count ) {
01061
01062 return 0;
01063 }
01064 adjustment = p_vthread->schedule_count * stride * team_size;
01065 p_vthread->ordered_count = p_vthread->schedule_count * team_size
01066 + global_tid;
01067 p_vthread->schedule_count += 1;
01068 p_vthread->rest_iter_count = chunk;
01069
01070 my_lower = global_lower + global_tid * stride + adjustment;
01071 my_upper = my_lower + block_size;
01072
01073 *plower = my_lower;
01074 *pupper = my_upper;
01075
01076 *pstride = incr;
01077 return 1;
01078
01079 break;
01080 case OMP_SCHED_ORDERED_DYNAMIC:
01081 __ompc_lock(&(p_team->schedule_lock));
01082
01083 global_lower = p_team->loop_lower_bound;
01084 global_upper = p_team->loop_upper_bound;
01085 incr = p_team->loop_increament;
01086 schedule_count = p_team->schedule_count;
01087 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
01088 trip_count = (global_upper - global_lower) / incr;
01089
01090 if ( trip_flag < 0) {
01091 __ompc_unlock(&(p_team->schedule_lock));
01092
01093 return 0;
01094 }
01095 trip_count += 1;
01096 my_lower = global_lower;
01097 chunk = p_team->chunk_size;
01098 my_upper = my_lower + (chunk - 1) * incr;
01099 p_team->loop_lower_bound = my_lower + chunk * incr;
01100 p_team->schedule_count += 1;
01101
01102 __ompc_unlock(&(p_team->schedule_lock));
01103
01104 p_vthread->ordered_count = schedule_count;
01105 p_vthread->rest_iter_count = chunk;
01106
01107 *plower = my_lower;
01108 *pupper = my_upper;
01109 *pstride = incr;
01110 return 1;
01111
01112 break;
01113 case OMP_SCHED_ORDERED_GUIDED:
01114 __ompc_lock(&(p_team->schedule_lock));
01115
01116 global_lower = p_team->loop_lower_bound;
01117 global_upper = p_team->loop_upper_bound;
01118 incr = p_team->loop_increament;
01119 trip_flag = (global_upper - global_lower) * 1.0 / (float)incr;
01120 trip_count = (global_upper - global_lower) / incr ;
01121 schedule_count = p_team->schedule_count;
01122
01123 if ( trip_flag < 0) {
01124 __ompc_unlock(&(p_team->schedule_lock));
01125
01126 return 0;
01127 }
01128 trip_count += 1;
01129 my_lower = global_lower;
01130 block_size = trip_count / team_size;
01131 chunk = p_team->chunk_size;
01132 if (block_size > chunk)
01133 chunk = block_size;
01134 my_upper = my_lower + (chunk - 1) * incr;
01135 p_team->loop_lower_bound = my_lower + chunk * incr;
01136 p_team->schedule_count +=1;
01137 p_vthread->rest_iter_count = chunk;
01138
01139 __ompc_unlock(&(p_team->schedule_lock));
01140
01141 p_vthread->ordered_count = schedule_count;
01142
01143 *plower = my_lower;
01144 *pupper = my_upper;
01145 *pstride = incr;
01146 return 1;
01147
01148 break;
01149 default:
01150
01151 Not_Valid(" unknown schedule type specified");
01152 }
01153
01154 return 0;
01155 }
01156
01157
01158 void
01159 __ompc_scheduler_fini(omp_int32 global_tid)
01160 {
01161
01162 }
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172 void
01173 __ompc_ordered (omp_int32 global_tid)
01174 {
01175 omp_v_thread_t *p_vthread;
01176 omp_team_t *p_team;
01177
01178 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL)
01179 return;
01180
01181 p_vthread = __ompc_get_v_thread_by_num(global_tid);
01182 p_team = p_vthread->team;
01183
01184 if (p_team->team_size == 1)
01185 return;
01186
01187 pthread_mutex_lock(&(p_team->schedule_lock));
01188 while (p_team->ordered_count != p_vthread->ordered_count)
01189 pthread_cond_wait(&(p_team->ordered_cond), &(p_team->schedule_lock));
01190 pthread_mutex_unlock(&(p_team->schedule_lock));
01191 }
01192
01193
01194 void
01195 __ompc_end_ordered (omp_int32 global_tid)
01196 {
01197 omp_v_thread_t *p_vthread;
01198 omp_team_t *p_team;
01199
01200 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL)
01201 return;
01202
01203 p_vthread = __ompc_get_v_thread_by_num(global_tid);
01204
01205 if (--p_vthread->rest_iter_count > 0)
01206 return;
01207
01208 p_team = p_vthread->team;
01209
01210 if (p_team->team_size == 1)
01211 return;
01212
01213 __ompc_lock(&(p_team->schedule_lock));
01214 p_team->ordered_count++;
01215 pthread_cond_broadcast(&(p_team->ordered_cond));
01216 __ompc_unlock(&(p_team->schedule_lock));
01217 }
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234 omp_int32
01235 __ompc_single (omp_int32 global_tid)
01236 {
01237 omp_team_t *p_team;
01238 omp_v_thread_t *p_vthread;
01239 int is_first = 0;
01240
01241 if (__omp_exe_mode & OMP_EXE_MODE_SEQUENTIAL)
01242 return 1;
01243 if (__omp_exe_mode & OMP_EXE_MODE_NORMAL) {
01244 p_team = &__omp_level_1_team_manager;
01245 p_vthread = &__omp_level_1_team[global_tid];
01246 } else {
01247 p_vthread = __ompc_get_v_thread_by_num(global_tid);
01248 p_team = p_vthread->team;
01249 }
01250
01251 if (p_team->team_size == 1) {
01252
01253 return 1;
01254 }
01255
01256 p_vthread->single_count++;
01257
01258 __ompc_lock(&(p_team->single_lock));
01259 if (p_team->single_count < p_vthread->single_count) {
01260 p_team->single_count++;
01261 is_first = 1;
01262 }
01263 __ompc_unlock(&(p_team->single_lock));
01264
01265 return is_first;
01266 }
01267
01268
01269 void
01270 __ompc_end_single (omp_int32 global_tid)
01271 {
01272
01273
01274 }
01275
01276
01277 omp_int32
01278 __ompc_master (omp_int32 global_tid)
01279 {
01280
01281 if (global_tid == 0) return 1;
01282 return 0;
01283 }
01284
01285 void
01286 __ompc_end_master (omp_int32 global_tid)
01287 {
01288
01289 }
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301 omp_int32
01302 __ompc_get_thdprv(void *** thdprv_p, omp_int64 size, void *datap,omp_int32 global_tid)
01303 {
01304 void **pp,*p;
01305
01306 int num_threads;
01307
01308 num_threads=OMP_MAX_NUM_THREADS;
01309
01310 if((pp = *thdprv_p) == NULL) {
01311 __ompc_lock(&_ompc_thread_lock);
01312
01313 if((pp = *thdprv_p) == NULL) {
01314 pp = (void *)malloc(sizeof(void *)*num_threads);
01315 bzero(pp,sizeof(void *)*num_threads);
01316 Is_True (pp !=NULL, "cannot allocate memory");
01317 *thdprv_p = pp;
01318 }
01319 __ompc_unlock(&_ompc_thread_lock);
01320 }
01321 if((p = pp[global_tid]) == NULL) {
01322 if(global_tid == 0)
01323 p = datap;
01324 else
01325 p = (void *)malloc((int)size);
01326 pp[global_tid] = p;
01327 }
01328 return 1;
01329 }
01330
01331 omp_int32
01332 __ompc_copyin_thdprv(int num,... )
01333
01334 {
01335 char* dst;
01336 char* src;
01337 int nbyte,iter;
01338 va_list arguments;
01339 int x;
01340
01341 va_start (arguments,num);
01342 iter=num/3;
01343 for (x=0;x<iter;x++) {
01344 dst = va_arg (arguments, char*);
01345 src = va_arg (arguments, char*);
01346 nbyte = va_arg (arguments, int);
01347 if(dst != src) bcopy(src,dst,nbyte);
01348 }
01349 va_end (arguments);
01350
01351
01352
01353 }
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364
01365 omp_int32
01366 __ompc_copyprivate(omp_int32 mpsp_status, void *cppriv,\
01367 void(*cp)(void* src, void* dst))
01368 {
01369 omp_v_thread_t *temp_v_thread;
01370 omp_team_t *p_team;
01371
01372 temp_v_thread = __ompc_get_current_v_thread();
01373 p_team = temp_v_thread->team;
01374 p_team->cppriv_counter= p_team->team_size;
01375
01376 if (mpsp_status==1)
01377 p_team->cppriv=(void *)cppriv;
01378 __ompc_barrier();
01379 if (mpsp_status!=1)
01380 cp(p_team->cppriv, cppriv);
01381
01382
01383 __ompc_barrier();
01384
01385 }