Index: openmp/tools/archer/ompt-tsan.cpp =================================================================== --- openmp/tools/archer/ompt-tsan.cpp +++ openmp/tools/archer/ompt-tsan.cpp @@ -417,19 +417,24 @@ const void *codePtr; + int Type{0}; + + bool isLeague() { return Type & ompt_parallel_league; } + void *GetParallelPtr() { return &(Barrier[1]); } void *GetBarrierPtr(unsigned Index) { return &(Barrier[Index]); } - ParallelData *Init(const void *codeptr) { + ParallelData *Init(const void *codeptr, int type) { codePtr = codeptr; + Type = type; return this; } void Reset() {} - static ParallelData *New(const void *codeptr) { - return DataPoolEntry::New()->Init(codeptr); + static ParallelData *New(const void *codeptr, int type) { + return DataPoolEntry::New()->Init(codeptr, type); } ParallelData(DataPool *dp) : DataPoolEntry(dp) {} @@ -489,6 +494,9 @@ /// count execution phase int execution{0}; + /// Number of the thread in a team + int ThreadNum{0}; + /// Index of which barrier to use next. char BarrierIndex{0}; @@ -552,9 +560,10 @@ return this; } - TaskData *Init(ParallelData *team, int taskType) { + TaskData *Init(ParallelData *team, int taskType, int threadNum) { TaskType = taskType; execution = 1; + ThreadNum = threadNum; ImplicitTask = this; Team = team; return this; @@ -564,6 +573,7 @@ InBarrier = false; TaskType = 0; execution = 0; + ThreadNum = 0; BarrierIndex = 0; RefCount = 1; Parent = nullptr; @@ -589,8 +599,8 @@ return DataPoolEntry::New()->Init(parent, taskType); } - static TaskData *New(ParallelData *team, int taskType) { - return DataPoolEntry::New()->Init(team, taskType); + static TaskData *New(ParallelData *team, int taskType, int threadNum) { + return DataPoolEntry::New()->Init(team, taskType, threadNum); } TaskData(DataPool *dp) : DataPoolEntry(dp) {} @@ -637,7 +647,7 @@ ompt_data_t *parallel_data, uint32_t requested_team_size, int flag, const void *codeptr_ra) { - ParallelData *Data = ParallelData::New(codeptr_ra); + ParallelData *Data = ParallelData::New(codeptr_ra, flag); parallel_data->ptr = Data; TsanHappensBefore(Data->GetParallelPtr()); @@ -651,8 +661,8 @@ if (archer_flags->ignore_serial && ToTaskData(task_data)->isInitial()) TsanIgnoreWritesBegin(); ParallelData *Data = ToParallelData(parallel_data); - TsanHappensAfter(Data->GetBarrierPtr(0)); - TsanHappensAfter(Data->GetBarrierPtr(1)); + if (Data->isLeague()) + TsanHappensAfter(Data->GetParallelPtr()); Data->Delete(); @@ -671,10 +681,11 @@ unsigned int thread_num, int type) { switch (endpoint) { case ompt_scope_begin: - if (type & ompt_task_initial) { - parallel_data->ptr = ParallelData::New(nullptr); + if (type & ompt_task_initial && parallel_data->ptr == NULL) { + parallel_data->ptr = ParallelData::New(nullptr, ompt_parallel_team); } - task_data->ptr = TaskData::New(ToParallelData(parallel_data), type); + task_data->ptr = + TaskData::New(ToParallelData(parallel_data), type, thread_num); TsanHappensAfter(ToParallelData(parallel_data)->GetParallelPtr()); TsanFuncEntry(ToParallelData(parallel_data)->codePtr); break; @@ -687,7 +698,11 @@ assert(Data->RefCount == 1 && "All tasks should have finished at the implicit barrier!"); if (type & ompt_task_initial) { - Data->Team->Delete(); + if (Data->Team->isLeague()) { + TsanHappensBefore(Data->Team->GetParallelPtr()); + } else { + Data->Team->Delete(); + } } Data->Delete(); TsanFuncExit(); @@ -766,7 +781,7 @@ char BarrierIndex = Data->BarrierIndex; // Barrier will end after it has been entered by all threads. - if (parallel_data) + if (parallel_data || Data->ThreadNum == 0) TsanHappensAfter(Data->Team->GetBarrierPtr(BarrierIndex)); // It is not guaranteed that all threads have exited this barrier before @@ -851,14 +866,15 @@ TaskData *Data; assert(new_task_data->ptr == NULL && "Task data should be initialized to NULL"); + // This case tries to maintain some pre-5.0 backwards compatibility if (type & ompt_task_initial) { ompt_data_t *parallel_data; int team_size = 1; ompt_get_parallel_info(0, ¶llel_data, &team_size); - ParallelData *PData = ParallelData::New(nullptr); + ParallelData *PData = ParallelData::New(nullptr, ompt_parallel_team); parallel_data->ptr = PData; - Data = TaskData::New(PData, type); + Data = TaskData::New(PData, type, 0); new_task_data->ptr = Data; } else if (type & ompt_task_undeferred) { Data = TaskData::New(ToTaskData(parent_task_data), type);