int main ( int argc, char **argv ) { int i; bool check = true; main__loop_1_data_t _loop_data; A = 0; WD *wg = getMyThreadSafe()->getCurrentWD(); for ( i = 0; i < NUM_ITERS; i++ ) { // If we're done processing half of the dataset if ( i == NUM_ITERS/2 ) { // Stop scheduler sys.stopScheduler(); } // Work descriptor creation WD * wd = new WD( new SMPDD( main__loop_1 ), sizeof( _loop_data ), __alignof__(nanos_loop_info_t), ( void * ) &_loop_data ); wd->setPriority( 100 ); // Work Group affiliation wg->addWork( *wd ); // Work submission sys.submit( *wd ); if ( i == ( NUM_ITERS/2 + 5 ) ){ // Keep going sys.startScheduler(); } } // barrier (kind of) wg->waitCompletion(); /* * How can we be sure the test passed? Each task increments A. If we run N * tasks, A should be equal to N. * If it's less than N, that'd mean the scheduler lost something. */ if ( A.value() != NUM_ITERS ) check = false; if ( check ) { fprintf(stderr, "%s : %s\n", argv[0], "successful"); return 0; } else { fprintf(stderr, "%s: %s\n", argv[0], "unsuccessful"); return -1; } }
int main ( int argc, char **argv ) { int i; bool check = true; main__loop_1_data_t _loop_data; // Repeat the test NUM_RUNS times for ( int testNumber = 0; testNumber < NUM_RUNS; ++testNumber ) { A = 0; WG *wg = getMyThreadSafe()->getCurrentWD(); // Stop scheduler sys.stopScheduler(); // increment variable for ( i = 0; i < NUM_ITERS; i++ ) { // Work descriptor creation WD * wd = new WD( new SMPDD( main__loop_1 ), sizeof( _loop_data ), __alignof__(nanos_loop_info_t), ( void * ) &_loop_data ); wd->setPriority( 100 ); // Work Group affiliation wg->addWork( *wd ); // Work submission sys.submit( *wd ); } // Re-enable the scheduler sys.startScheduler(); // barrier (kind of) wg->waitCompletion(); /* * The verification criteria is that A is equal to the number of tasks * run. Should A be lower, that would indicate that not all tasks * successfuly finished. */ if ( A.value() != NUM_ITERS ) check = false; } if ( check ) { fprintf(stderr, "%s : %s\n", argv[0], "successful"); return 0; } else { fprintf(stderr, "%s: %s\n", argv[0], "unsuccessful"); return -1; } }
int main ( int argc, char **argv ) { int i; bool check = true; main__loop_1_data_t _loop_data; // initialize vector for ( i = 0; i < VECTOR_SIZE; i++ ) A[i] = 0; // Stop scheduler sys.stopScheduler(); sys.waitUntilThreadsPaused(); WG *wg = getMyThreadSafe()->getCurrentWD(); // increment vector for ( i = 0; i < NUM_ITERS; i++ ) { #if USE_NANOS // loop info initialization _loop_data.loop_info.lower = 0; _loop_data.loop_info.upper = VECTOR_SIZE; _loop_data.loop_info.step = + 1; // Work descriptor creation WD * wd = new WD( new SMPDD( main__loop_1 ), sizeof( _loop_data ), __alignof__(nanos_loop_info_t), ( void * ) &_loop_data ); wd->setPriority( 100 ); // Work Group affiliation wg->addWork( *wd ); // Work submission sys.submit( *wd ); #else for ( int j = 0; j < VECTOR_SIZE; j++ ) A[j] += 100; #endif } for ( i = 0; i < sys.getNumWorkers(); ++i ) { #if USE_NANOS // Second task: set to 0 WD* wd = new WD( new SMPDD( main__loop_2 ), sizeof( _loop_data ), __alignof__(nanos_loop_info_t), ( void * ) &_loop_data ); // Use a higher priority wd->setPriority( 150 ); wg->addWork( *wd ); // Work submission sys.submit( *wd ); #else for ( int j = 0; j < VECTOR_SIZE; j++ ) A[j] = 0; #endif } // Re-enable the scheduler sys.startScheduler(); sys.waitUntilThreadsUnpaused(); // barrier (kind of) wg->waitCompletion(); /* * Verification criteria: The priority scheduler must ensure that the * highest priority task that was submitted the latest is executed before * at least one lower priority task. * In this case, as the highest priority task sets the elements in the A * array to 0, it is as simple as checking if that's the value at the end of * the execution. If it is, the test failed, otherwise, succeeded. */ for ( i = 0; i < VECTOR_SIZE; i++ ) if ( A[i] == 0 ) check = false; if ( check ) { fprintf(stderr, "%s : %s\n", argv[0], "successful"); return 0; } else { fprintf(stderr, "%s: %s\n", argv[0], "unsuccessful"); return -1; } }