@@ -158,6 +158,34 @@ void SharedMemorySmartStackTy::pop(void *Ptr, uint64_t Bytes) {
158158 memory::freeGlobal (Ptr, " Slow path shared memory deallocation" );
159159}
160160
161+ struct DynCGroupMemTy {
162+ void init (KernelLaunchEnvironmentTy *KLE, void *NativeDynCGroup) {
163+ Size = 0 ;
164+ Ptr = nullptr ;
165+ IsFallback = false ;
166+ if (KLE) {
167+ Size = KLE->DynCGroupMemSize ;
168+ if (void *Fallback = KLE->DynCGroupMemFallback ) {
169+ Ptr = static_cast <char *>(Fallback) + Size * omp_get_team_num ();
170+ IsFallback = true ;
171+ } else {
172+ Ptr = static_cast <char *>(NativeDynCGroup);
173+ }
174+ }
175+ }
176+
177+ char *getPtr (size_t Offset) const { return Ptr + Offset; }
178+ bool isFallback () const { return IsFallback; }
179+ size_t getSize () const { return Size; }
180+
181+ private:
182+ char *Ptr;
183+ size_t Size;
184+ bool IsFallback;
185+ };
186+
187+ [[clang::loader_uninitialized]] static Local<DynCGroupMemTy> DynCGroupMem;
188+
161189} // namespace
162190
163191void *memory::getDynamicBuffer () { return DynamicSharedBuffer; }
@@ -246,13 +274,18 @@ int returnValIfLevelIsActive(int Level, int Val, int DefaultVal,
246274} // namespace
247275
248276void state::init (bool IsSPMD, KernelEnvironmentTy &KernelEnvironment,
249- KernelLaunchEnvironmentTy &KernelLaunchEnvironment ) {
277+ KernelLaunchEnvironmentTy *KLE ) {
250278 SharedMemorySmartStack.init (IsSPMD);
279+
280+ if (KLE == reinterpret_cast <KernelLaunchEnvironmentTy *>(~0 ))
281+ KLE = nullptr ;
282+
251283 if (mapping::isInitialThreadInLevel0 (IsSPMD)) {
284+ DynCGroupMem.init (KLE, DynamicSharedBuffer);
252285 TeamState.init (IsSPMD);
253286 ThreadStates = nullptr ;
254287 KernelEnvironmentPtr = &KernelEnvironment;
255- KernelLaunchEnvironmentPtr = &KernelLaunchEnvironment ;
288+ KernelLaunchEnvironmentPtr = KLE ;
256289 }
257290}
258291
@@ -430,6 +463,17 @@ int omp_get_team_num() { return mapping::getBlockIdInKernel(); }
430463int omp_get_initial_device (void ) { return -1 ; }
431464
432465int omp_is_initial_device (void ) { return 0 ; }
466+
467+ void *omp_get_dyn_groupprivate_ptr (size_t Offset, int *IsFallback,
468+ omp_access_t ) {
469+ if (IsFallback != NULL )
470+ *IsFallback = DynCGroupMem.isFallback ();
471+ return DynCGroupMem.getPtr (Offset);
472+ }
473+
474+ size_t omp_get_dyn_groupprivate_size (omp_access_t ) {
475+ return DynCGroupMem.getSize ();
476+ }
433477}
434478
435479extern " C" {
0 commit comments