Merge topic 'fix-openmp-segfaul' into release

47ee1b247 OpenMP: fix race condition

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Nickolas Davis <nadavi@sandia.gov>
Merge-request: !2625
This commit is contained in:
Vicente Bolea 2021-11-09 01:55:55 +00:00 committed by Kitware Robot
commit 134f0c8afe
2 changed files with 22 additions and 11 deletions

@ -333,6 +333,11 @@ struct ReduceHelper
bool doParallel = false;
vtkm::Id numThreads = 0;
vtkm::cont::RuntimeDeviceInformation{}
.GetRuntimeConfiguration(vtkm::cont::DeviceAdapterTagOpenMP())
.GetThreads(numThreads);
std::unique_ptr<ReturnType[]> threadData;
VTKM_OPENMP_DIRECTIVE(parallel default(none) firstprivate(f) shared(
@ -342,9 +347,6 @@ struct ReduceHelper
VTKM_OPENMP_DIRECTIVE(single)
{
vtkm::cont::RuntimeDeviceInformation{}
.GetRuntimeConfiguration(vtkm::cont::DeviceAdapterTagOpenMP())
.GetThreads(numThreads);
if (numVals >= numThreads * 2)
{
doParallel = true;
@ -534,15 +536,16 @@ void ReduceByKeyHelper(KeysInArray keysInArray,
internal::WrappedBinaryOperator<ValueType, BinaryFunctor> f(functor);
vtkm::Id outIdx = 0;
vtkm::Id numThreads = 0;
vtkm::cont::RuntimeDeviceInformation{}
.GetRuntimeConfiguration(vtkm::cont::DeviceAdapterTagOpenMP())
.GetThreads(numThreads);
VTKM_OPENMP_DIRECTIVE(parallel default(none) firstprivate(keysIn, valuesIn, keysOut, valuesOut, f)
shared(outIdx) VTKM_OPENMP_SHARED_CONST(numValues))
shared(numThreads, outIdx) VTKM_OPENMP_SHARED_CONST(numValues))
{
int tid = omp_get_thread_num();
vtkm::Id numThreads = 0;
vtkm::cont::RuntimeDeviceInformation{}
.GetRuntimeConfiguration(vtkm::cont::DeviceAdapterTagOpenMP())
.GetThreads(numThreads);
// Determine bounds for this thread's scan operation:
vtkm::Id chunkSize = (numValues + numThreads - 1) / numThreads;

@ -86,10 +86,18 @@ private:
VTKM_CONT vtkm::Id InitializeHardwareMaxThreads() const
{
vtkm::Id count = 0;
VTKM_OPENMP_DIRECTIVE(parallel)
if (omp_in_parallel())
{
VTKM_OPENMP_DIRECTIVE(atomic)
++count;
count = omp_get_num_threads();
}
else
{
VTKM_OPENMP_DIRECTIVE(parallel)
{
VTKM_OPENMP_DIRECTIVE(atomic)
++count;
}
}
return count;
}