Merge topic 'fix-openmp-segfaul'

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 be9ac1ef3f
2 changed files with 22 additions and 11 deletions

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

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