Exemplo n.º 1
0
  public void runParallel(ParallelTask task) {

    long start = System.currentTimeMillis();

    if (active) {
      throw new IllegalStateException("Unable to run already active parallel region");
    }

    for (OMPThread t : team) {
      t.setRootTask(TaskFactory.newTiedTask(task));
    }

    active = true;

    for (int i = 1; i < team.length; i++) {
      pool.executeTask(team[i]);
    }

    LoggingUtils.debug(log, "Starting tasks " + (System.currentTimeMillis() - start));
    team[0].run();

    start = System.currentTimeMillis();
    if (!tasks.isEmpty()) {
      throw new OMPRuntimeException(
          "Parallel region finished bu there are some tasks waiting to execute!");
    }

    active = false;

    barriers.clear();
    forLoops.clear();
    singles.clear();
    pool.kill();
    LoggingUtils.debug(log, "Killing region " + (System.currentTimeMillis() - start));
    if (levelNumber > 1) {
      team[0].setLevel(team[0].getLevel().getParent());
      OMPEngine.getInstance().putJavaOmpThreadRelation(team[0]);
    }
  }