 }
 
 EXTERN int omp_get_ancestor_thread_num(int level) {
-  if (isRuntimeUninitialized()) {
-    ASSERT0(LT_FUSSY, isSPMDMode(),
-            "Expected SPMD mode only with uninitialized runtime.");
+  if (isSPMDMode())
     return level == 1 ? GetThreadIdInBlock() : 0;
-  }
   int rc = -1;
-  if (level == 0) {
+  // If level is 0 or all parallel regions are not active - return 0.
+  unsigned parLevel = parallelLevel[GetWarpId()];
+  if (level == 0 || (level > 0 && parLevel < OMP_ACTIVE_PARALLEL_LEVEL &&
+                     level <= parLevel)) {
     rc = 0;
   } else if (level > 0) {
     int totLevel = omp_get_level();
     if (level <= totLevel) {
       omptarget_nvptx_TaskDescr *currTaskDescr =
-          getMyTopTaskDescriptor(isSPMDMode());
+          getMyTopTaskDescriptor(/*isSPMDExecutionMode=*/false);
       int steps = totLevel - level;
       PRINT(LD_IO, "backtrack %d steps\n", steps);
       ASSERT0(LT_FUSSY, currTaskDescr,

}

EXTERN int omp_get_team_size(int level) {
  if (isRuntimeUninitialized()) {
    ASSERT0(LT_FUSSY, isSPMDMode(),
            "Expected SPMD mode only with uninitialized runtime.");
    return level == 1 ? GetNumberOfThreadsInBlock() : 1;
  }
  int rc = -1;
  if (level == 0) {
    rc = 1;
  } else if (level > 0) {
    int totLevel = omp_get_level();
    if (level <= totLevel) {
      omptarget_nvptx_TaskDescr *currTaskDescr =
          getMyTopTaskDescriptor(isSPMDMode());
      int steps = totLevel - level;
      ASSERT0(LT_FUSSY, currTaskDescr,
              "do not expect fct to be called in a non-active thread");

}

EXTERN int omp_get_max_threads(void) {
  if (parallelLevel[GetWarpId()] > 0)
    // We're already in parallel region.
    return 1; // default is 1 thread avail
  omptarget_nvptx_TaskDescr *currTaskDescr =
      getMyTopTaskDescriptor(/*isSPMDExecutionMode=*/false);
  ASSERT0(LT_FUSSY, !currTaskDescr->InParallelRegion(),
          "Should no be in the parallel region");
  // Not currently in a parallel region, return what was set.
  int rc = currTaskDescr->NThreads();
  ASSERT0(LT_FUSSY, rc >= 0, "bad number of threads");
  PRINT(LD_IO, "call omp_get_max_threads() return %d\n", rc);
  return rc;
}
