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:
commit
be9ac1ef3f
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user