Beispiel #1
0
void AbstractGangWorker::initialize() {
  this->record_stack_base_and_size();
  this->initialize_named_thread();
  assert(_gang != NULL, "No gang to run in");
  os::set_priority(this, NearMaxPriority);
  log_develop_trace(gc, workgang)("Running gang worker for gang %s id %u", gang()->name(), id());
  // The VM thread should not execute here because MutexLocker's are used
  // as (opposed to MutexLockerEx's).
  assert(!Thread::current()->is_VM_thread(), "VM thread should not be part"
         " of a work gang");
}
Beispiel #2
0
int main ()
{

#pragma acc parallel num_gangs (32) num_workers (32) vector_length (32)
  {
    gang ();
    worker ();
    vector ();
    seq ();
  }

  return 0;
}
Beispiel #3
0
void GangWorker::initialize() {
  this->initialize_thread_local_storage();
  assert(_gang != NULL, "No gang to run in");
  os::set_priority(this, NearMaxPriority);
  if (TraceWorkGang) {
    tty->print_cr("Running gang worker for gang %s id %d",
                  gang()->name(), id());
  }
  // The VM thread should not execute here because MutexLocker's are used
  // as (opposed to MutexLockerEx's).
  assert(!Thread::current()->is_VM_thread(), "VM thread should not be part"
         " of a work gang");
}
Beispiel #4
0
static void initWormhole( struct state *st, wormhole * worm, Display * display, Window win )
{
	
	int i;
	XWindowAttributes attr;

	XGetWindowAttributes( st->dpy, st->window, &attr );

	st->cmap = attr.colormap;
	
	st->SCREEN_X = attr.width;
	st->SCREEN_Y = attr.height;

# ifdef HAVE_COCOA	/* Don't second-guess Quartz's double-buffering */
        worm->work = st->window;
# else
	worm->work = XCreatePixmap( st->dpy, st->window, st->SCREEN_X, st->SCREEN_Y, attr.depth );
# endif

	worm->diameter = rnd( 10 ) + 15;
	worm->diameter_change = rnd( 10 ) + 15;
	/* worm->actualx = rnd( attr.width );
	worm->actualy = rnd( attr.height ); */
	worm->actualx = attr.width / 2;
	worm->actualy = attr.height / 2;
	worm->virtualx = worm->actualx;
	worm->virtualy = worm->actualy;
	worm->speed = (float)st->SCREEN_X / 180.0;
	/* z_speed = SCREEN_X / 120; */
	worm->spiral = 0;
	worm->addStar = st->make_stars;
	worm->want_x = rnd( attr.width - 50 ) + 25;
	worm->want_y = rnd( attr.height - 50 ) + 25;
	worm->want_ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
	worm->ang = worm->want_ang;
	worm->max_Z = 600;
	worm->black.red = 0;
	worm->black.green = 0;
	worm->black.blue = 0;
	XAllocColor( st->dpy, st->cmap, &worm->black );
	initColorChanger( st, &(worm->changer) );

	worm->num_stars = 64;
	worm->stars = (starline **)malloc( sizeof(starline *) * worm->num_stars );
	for ( i = 0; i < worm->num_stars; i++ )
		worm->stars[i] = NULL;

}
int main ()
{
  int ary[N];
  int ix;
  int exit = 0;
  int ondev = 0;

  for (ix = 0; ix < N;ix++)
    ary[ix] = -1;
  
#pragma acc parallel num_gangs(32) copy(ary) copy(ondev)
  {
    ondev = acc_on_device (acc_device_not_host);
    gang (ary);
  }

  for (ix = 0; ix < N; ix++)
    {
      int expected = ix;
      if(ondev)
	{
	  int g = ix / ((N + 31) / 32);
	  int w = 0;
	  int v = 0;

	  expected = (g << 16) | (w << 8) | v;
	}
      
      if (ary[ix] != expected)
	{
	  exit = 1;
	  printf ("ary[%d]=%x expected %x\n", ix, ary[ix], expected);
	}
    }
  
  return exit;
}
Beispiel #6
0
int main (void)
{
  Type ary[N], sum = 0, prod = 1;

  for (int ix = 0; ix < N;  ix++)
    {
      float frac = ix * (1.0f / 1024) + 1.0f;
      
      ary[ix] = frac;
      sum += ary[ix];
      prod *= ary[ix];
    }

  if (vector (ary, sum, prod))
    return 1;
  
  if (worker (ary, sum, prod))
    return 1;

  if (gang (ary, sum, prod))
    return 1;

  return 0;
}
///////////////////////////////
// YieldingFlexibleGangWorker
///////////////////////////////
void YieldingFlexibleGangWorker::loop() {
  int previous_sequence_number = 0;
  Monitor* gang_monitor = gang()->monitor();
  MutexLockerEx ml(gang_monitor, Mutex::_no_safepoint_check_flag);
  WorkData data;
  int id;
  while (true) {
    // Check if there is work to do or if we have been asked
    // to terminate
    gang()->internal_worker_poll(&data);
    if (data.terminate()) {
      // We have been asked to terminate.
      assert(gang()->task() == NULL, "No task binding");
      // set_status(TERMINATED);
      return;
    } else if (data.task() != NULL &&
               data.sequence_number() != previous_sequence_number) {
      // There is work to be done.
      // First check if we need to become active or if there
      // are already the requisite number of workers
      if (gang()->started_workers() == yf_gang()->active_workers()) {
        // There are already enough workers, we do not need to
        // to run; fall through and wait on monitor.
      } else {
        // We need to pitch in and do the work.
        assert(gang()->started_workers() < yf_gang()->active_workers(),
               "Unexpected state");
        id = gang()->started_workers();
        gang()->internal_note_start();
        // Now, release the gang mutex and do the work.
        {
          MutexUnlockerEx mul(gang_monitor, Mutex::_no_safepoint_check_flag);
          data.task()->work(id);   // This might include yielding
        }
        // Reacquire monitor and note completion of this worker
        gang()->internal_note_finish();
        // Update status of task based on whether all workers have
        // finished or some have yielded
        assert(data.task() == gang()->task(), "Confused task binding");
        if (gang()->finished_workers() == yf_gang()->active_workers()) {
          switch (data.yf_task()->status()) {
            case ABORTING: {
              data.yf_task()->set_status(ABORTED);
              break;
            }
            case ACTIVE:
            case COMPLETING: {
              data.yf_task()->set_status(COMPLETED);
              break;
            }
            default:
              ShouldNotReachHere();
          }
          gang_monitor->notify_all();  // Notify overseer
        } else { // at least one worker is still working or yielded
          assert(gang()->finished_workers() < yf_gang()->active_workers(),
                 "Counts inconsistent");
          switch (data.yf_task()->status()) {
            case ACTIVE: {
              // first, but not only thread to complete
              data.yf_task()->set_status(COMPLETING);
              break;
            }
            case YIELDING: {
              if (gang()->finished_workers() + yf_gang()->yielded_workers()
                  == yf_gang()->active_workers()) {
                data.yf_task()->set_status(YIELDED);
                gang_monitor->notify_all();  // notify overseer
              }
              break;
            }
            case ABORTING:
            case COMPLETING: {
              break; // nothing to do
            }
            default: // everything else: INACTIVE, YIELDED, ABORTED, COMPLETED
              ShouldNotReachHere();
          }
        }
      }
    }
    // Remember the sequence number
    previous_sequence_number = data.sequence_number();
    // Wait for more work
    gang_monitor->wait(Mutex::_no_safepoint_check_flag);
  }
}
void YieldingFlexibleGangTask::abort() {
  assert(gang() != NULL, "No gang to signal");
  gang()->abort();
}
Beispiel #9
0
 YieldingFlexibleWorkGang* yf_gang() const
   { return (YieldingFlexibleWorkGang*)gang(); }
Beispiel #10
0
void GangWorker::signal_task_done() {
  gang()->dispatcher()->worker_done_with_task();
}
Beispiel #11
0
bool GangWorker::is_ConcurrentGC_thread() const {
  return gang()->are_ConcurrentGC_threads();
}
Beispiel #12
0
bool GangWorker::is_GC_task_thread() const {
  return gang()->are_GC_task_threads();
}
Beispiel #13
0
void GangWorker::loop() {
  int previous_sequence_number = 0;
  Monitor* gang_monitor = gang()->monitor();
  for ( ; /* !terminate() */; ) {
    WorkData data;
    int part;  // Initialized below.
    {
      // Grab the gang mutex.
      MutexLocker ml(gang_monitor);
      // Wait for something to do.
      // Polling outside the while { wait } avoids missed notifies
      // in the outer loop.
      gang()->internal_worker_poll(&data);
      if (TraceWorkGang) {
        tty->print("Polled outside for work in gang %s worker %d",
                   gang()->name(), id());
        tty->print("  terminate: %s",
                   data.terminate() ? "true" : "false");
        tty->print("  sequence: %d (prev: %d)",
                   data.sequence_number(), previous_sequence_number);
        if (data.task() != NULL) {
          tty->print("  task: %s", data.task()->name());
        } else {
          tty->print("  task: NULL");
        }
        tty->cr();
      }
      for ( ; /* break or return */; ) {
        // Terminate if requested.
        if (data.terminate()) {
          gang()->internal_note_finish();
          gang_monitor->notify_all();
          return;
        }
        // Check for new work.
        if ((data.task() != NULL) &&
            (data.sequence_number() != previous_sequence_number)) {
          if (gang()->needs_more_workers()) {
            gang()->internal_note_start();
            gang_monitor->notify_all();
            part = gang()->started_workers() - 1;
            break;
          }
        }
        // Nothing to do.
        gang_monitor->wait(/* no_safepoint_check */ true);
        gang()->internal_worker_poll(&data);
        if (TraceWorkGang) {
          tty->print("Polled inside for work in gang %s worker %d",
                     gang()->name(), id());
          tty->print("  terminate: %s",
                     data.terminate() ? "true" : "false");
          tty->print("  sequence: %d (prev: %d)",
                     data.sequence_number(), previous_sequence_number);
          if (data.task() != NULL) {
            tty->print("  task: %s", data.task()->name());
          } else {
            tty->print("  task: NULL");
          }
          tty->cr();
        }
      }
      // Drop gang mutex.
    }
    if (TraceWorkGang) {
      tty->print("Work for work gang %s id %d task %s part %d",
                 gang()->name(), id(), data.task()->name(), part);
    }
    assert(data.task() != NULL, "Got null task");
    data.task()->work(part);
    {
      if (TraceWorkGang) {
        tty->print("Finish for work gang %s id %d task %s part %d",
                   gang()->name(), id(), data.task()->name(), part);
      }
      // Grab the gang mutex.
      MutexLocker ml(gang_monitor);
      gang()->internal_note_finish();
      // Tell the gang you are done.
      gang_monitor->notify_all();
      // Drop the gang mutex.
    }
    previous_sequence_number = data.sequence_number();
  }
}
Beispiel #14
0
static void moveWormhole( struct state *st, wormhole * worm )
{

	int q;
	double dx, dy;
	/* int x1, y1, x2, y2; */
	int min_dist = 100;
	int find = 0;
	dx = Cos( worm->ang ) * worm->speed;
	dy = Sine( worm->ang ) * worm->speed;

	worm->virtualx += dx;
	worm->virtualy += dy;
	worm->actualx = (int)worm->virtualx;
	worm->actualy = (int)worm->virtualy;

	if ( worm->spiral ){

		if ( worm->spiral % 5 == 0 )
			worm->ang = (worm->ang + 1 ) % 360;
		worm->spiral--;
		if ( worm->spiral <= 0 ) find = 1;

	} else {

		if ( dist( worm->actualx, worm->actualy, worm->want_x, worm->want_y ) < 20 )
			find = 1;

		if ( rnd( 20 ) == rnd( 20 ) )
			find = 1;

		if ( worm->actualx < min_dist ){
			worm->actualx = min_dist;
			worm->virtualx = worm->actualx;
			find = 1;
		}
		if ( worm->actualy < min_dist ){
			worm->actualy = min_dist;
			worm->virtualy = worm->actualy;
			find = 1;
		}
		if ( worm->actualx > st->SCREEN_X - min_dist ){
			worm->actualx = st->SCREEN_X - min_dist;
			worm->virtualx = worm->actualx;
			find = 1;
		}
		if ( worm->actualy > st->SCREEN_Y - min_dist ){
			worm->actualy = st->SCREEN_Y - min_dist;
			worm->virtualy = worm->actualy;
			find = 1;
		}
	
		if ( rnd( 500 ) == rnd( 500 ) ) worm->spiral = rnd( 30 ) + 50;
	}

	if ( find ){
		worm->want_x = rnd( st->SCREEN_X - min_dist * 2 ) + min_dist;
		worm->want_y = rnd( st->SCREEN_Y - min_dist * 2 ) + min_dist;
		worm->ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
	}


	/* worm->ang = ( worm->ang + 360 + rnd( 30 ) - 15 ) % 360; */

	/*
	if ( worm->ang < worm->want_ang ) worm->ang++;
	if ( worm->ang > worm->want_ang ) worm->ang--;
	if ( worm->ang == worm->want_ang && rnd( 3 ) == rnd( 3 ) ) worm->want_ang = rnd( 360 );
	*/

	/*
	if ( rnd( 25 ) == rnd( 25 ) ){
		x1 = worm->actualx;
		y1 = worm->actualy;
		x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
		y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
		worm->want_ang = gang(x1,y1,x2,y2);
	}
	*/

	/*
	if ( worm->actualx < min_dist || worm->actualx > SCREEN_X - min_dist || worm->actualy < min_dist || worm->actualy > SCREEN_Y - min_dist ){
		x1 = worm->actualx;
		y1 = worm->actualy;
		x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
		y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
		/ * worm->ang = gang( worm->actualx, worm->actualy, SCREEN_X/2+rnd(20)-10, SCREEN_Y/2+rnd(20)-10 ); * /
		worm->ang = gang( x1, y1, x2, y2 );
		worm->want_ang = worm->ang;
		/ * printf("Angle = %d\n", worm->ang ); * /

		if ( worm->actualx < min_dist )
			worm->actualx = min_dist;
		if ( worm->actualx > SCREEN_X - min_dist )
			worm->actualx = SCREEN_X - min_dist;
		if ( worm->actualy < min_dist )
			worm->actualy = min_dist;
		if ( worm->actualy > SCREEN_Y - min_dist )
			worm->actualy = SCREEN_Y - min_dist;
		worm->virtualx = worm->actualx;
		worm->virtualy = worm->actualy;
	}
	*/

	for ( q = 0; q < worm->num_stars; q++ ){
		if ( worm->stars[q] != NULL ){
			if ( moveStar( st, worm->stars[q] ) ){
				free( worm->stars[q] );
				worm->stars[q] = NULL;
			}
		}
	}

	moveColorChanger( &worm->changer );

	if ( worm->diameter < worm->diameter_change )
		worm->diameter++;
	if ( worm->diameter > worm->diameter_change )
		worm->diameter--;
	if ( rnd( 30 ) == rnd( 30 ) )
		worm->diameter_change = rnd( 35 ) + 5;

	for ( q = 0; q < worm->addStar; q++ )
		addStar( worm );

}
Beispiel #15
0
WorkData GangWorker::wait_for_task() {
  return gang()->dispatcher()->worker_wait_for_task();
}
Beispiel #16
0
void GangWorker::run() {
  this->initialize_thread_local_storage();
  assert(_gang != NULL, "No gang to run in");
  Monitor* gang_monitor = gang()->monitor();
  os::set_priority(this, MaxPriority);
  if (TraceWorkGang) {
    tty->print_cr("Running gang worker for gang %s id %d",
		  gang()->name(), id());
  }
  int previous_sequence_number = 0;
  // The VM thread should not execute here because MutexLocker's are used
  // as (opposed to MutexLockerEx's).
  assert(!Thread::current()->is_VM_thread(), "VM thread should not be part"
	 " of a work gang");
  for ( ; /* !terminate() */; ) {
    WorkData data;
    int part;  // Initialized below.
    {
      // Grab the gang mutex.
      MutexLocker ml(gang_monitor);
      // Wait for something to do.
      // Polling outside the while { wait } avoids missed notifies
      // in the outer loop.
      gang()->internal_worker_poll(&data);
      if (TraceWorkGang) {
	tty->print("Polled outside for work in gang %s worker %d",
		   gang()->name(), id());
	tty->print("  terminate: %s",
		   data.terminate() ? "true" : "false");
	tty->print("  sequence: %d (prev: %d)",
		   data.sequence_number(), previous_sequence_number);
	if (data.task() != NULL) {
	  tty->print("  task: %s", data.task()->name());
	} else {
	  tty->print("  task: NULL");
	}
	tty->cr();
      }
      for ( ; /* break or return */; ) {
	// Terminate if requested.
	if (data.terminate()) {
	  gang()->internal_note_finish();
	  gang_monitor->notify_all();
	  return;
	}
	// Check for new work.
	if ((data.task() != NULL) &&
	    (data.sequence_number() != previous_sequence_number)) {
	  gang()->internal_note_start();
	  gang_monitor->notify_all();
	  part = gang()->started_workers() - 1;
	  break;
	}
	// Nothing to do.
	gang_monitor->wait(/* no_safepoint_check */ true);
	gang()->internal_worker_poll(&data);
	if (TraceWorkGang) {
	  tty->print("Polled inside for work in gang %s worker %d",
		     gang()->name(), id());
	  tty->print("  terminate: %s",
		     data.terminate() ? "true" : "false");
	  tty->print("  sequence: %d (prev: %d)",
		     data.sequence_number(), previous_sequence_number);
	  if (data.task() != NULL) {
	    tty->print("  task: %s", data.task()->name());
	  } else {
	    tty->print("  task: NULL");
	  }
	  tty->cr();
	}
      }
      // Drop gang mutex.
    }
    if (TraceWorkGang) {
      tty->print("Work for work gang %s id %d task %s part %d",
		 gang()->name(), id(), data.task()->name(), part);
    }
    assert(data.task() != NULL, "Got null task");
    data.task()->work(part);
    {
      if (TraceWorkGang) {
	tty->print("Finish for work gang %s id %d task %s part %d",
		   gang()->name(), id(), data.task()->name(), part);
      }
      // Grab the gang mutex.
      MutexLocker ml(gang_monitor);
      gang()->internal_note_finish();
      // Tell the gang you are done.
      gang_monitor->notify_all();
      // Drop the gang mutex.
    }
    previous_sequence_number = data.sequence_number();
  }
}
Beispiel #17
0
void GangWorker::run() {

  printf("%s[%d] [tid: %lu]: 工作线程[%s:%d]正式启动...\n", __FILE__, __LINE__, pthread_self(), gang()->name(), id());

  initialize();
  loop();
}