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,16 +536,17 @@ 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_OPENMP_DIRECTIVE(parallel default(none) firstprivate(keysIn, valuesIn, keysOut, valuesOut, f)
shared(outIdx) VTKM_OPENMP_SHARED_CONST(numValues))
{
int tid = omp_get_thread_num();
vtkm::Id numThreads = 0; vtkm::Id numThreads = 0;
vtkm::cont::RuntimeDeviceInformation{} vtkm::cont::RuntimeDeviceInformation{}
.GetRuntimeConfiguration(vtkm::cont::DeviceAdapterTagOpenMP()) .GetRuntimeConfiguration(vtkm::cont::DeviceAdapterTagOpenMP())
.GetThreads(numThreads); .GetThreads(numThreads);
VTKM_OPENMP_DIRECTIVE(parallel default(none) firstprivate(keysIn, valuesIn, keysOut, valuesOut, f)
shared(numThreads, outIdx) VTKM_OPENMP_SHARED_CONST(numValues))
{
int tid = omp_get_thread_num();
// 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;
vtkm::Id scanIdx = std::min(tid * chunkSize, numValues); vtkm::Id scanIdx = std::min(tid * chunkSize, numValues);

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