Index: libomptarget/deviceRTLs/nvptx/src/libcall.cu =================================================================== --- libomptarget/deviceRTLs/nvptx/src/libcall.cu +++ libomptarget/deviceRTLs/nvptx/src/libcall.cu @@ -164,7 +164,8 @@ if (isRuntimeUninitialized()) { ASSERT0(LT_FUSSY, isSPMDMode(), "Expected SPMD mode only with uninitialized runtime."); - return parallelLevel; + // parallelLevel starts from 0, need to add 1 for correct level. + return parallelLevel + 1; } int level = 0; omptarget_nvptx_TaskDescr *currTaskDescr = Index: libomptarget/deviceRTLs/nvptx/src/loop.cu =================================================================== --- libomptarget/deviceRTLs/nvptx/src/loop.cu +++ libomptarget/deviceRTLs/nvptx/src/loop.cu @@ -205,8 +205,12 @@ INLINE static void dispatch_init(kmp_Ident *loc, int32_t threadId, kmp_sched_t schedule, T lb, T ub, ST st, ST chunk) { - ASSERT0(LT_FUSSY, checkRuntimeInitialized(loc), - "Expected non-SPMD mode + initialized runtime."); + if (checkRuntimeUninitialized(loc)) { + // In SPMD mode no need to check parallelism level - dynamic scheduling + // may appear only in L2 parallel regions with lightweight runtime. + ASSERT0(LT_FUSSY, checkSPMDMode(loc), "Expected non-SPMD mode."); + return; + } int tid = GetLogicalThreadIdInBlock(checkSPMDMode(loc)); omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(tid); T tnum = currTaskDescr->ThreadsInTeam(); @@ -439,8 +443,15 @@ INLINE static int dispatch_next(kmp_Ident *loc, int32_t gtid, int32_t *plast, T *plower, T *pupper, ST *pstride) { - ASSERT0(LT_FUSSY, checkRuntimeInitialized(loc), - "Expected non-SPMD mode + initialized runtime."); + if (checkRuntimeUninitialized(loc)) { + // In SPMD mode no need to check parallelism level - dynamic scheduling + // may appear only in L2 parallel regions with lightweight runtime. + ASSERT0(LT_FUSSY, checkSPMDMode(loc), "Expected non-SPMD mode."); + if (*plast) + return DISPATCH_FINISHED; + *plast = 1; + return DISPATCH_NOTFINISHED; + } // ID of a thread in its own warp // automatically selects thread or warp ID based on selected implementation Index: libomptarget/deviceRTLs/nvptx/src/parallel.cu =================================================================== --- libomptarget/deviceRTLs/nvptx/src/parallel.cu +++ libomptarget/deviceRTLs/nvptx/src/parallel.cu @@ -407,7 +407,7 @@ if (checkRuntimeUninitialized(loc)) { ASSERT0(LT_FUSSY, checkSPMDMode(loc), "Expected SPMD mode with uninitialized runtime."); - return parallelLevel; + return parallelLevel + 1; } int threadId = GetLogicalThreadIdInBlock(checkSPMDMode(loc));