mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-19 18:45:43 +00:00
Refactoring TBB atomics
This commit is contained in:
parent
e8b08f2e00
commit
da66ea6a15
@ -316,15 +316,17 @@ public:
|
||||
VTKM_EXEC_EXPORT
|
||||
T Add(vtkm::Id index, const T& value) const
|
||||
{
|
||||
T* lockedValue;
|
||||
#if defined(VTKM_MSVC)
|
||||
volatile T* lockedValue;
|
||||
typedef typename vtkm::cont::ArrayPortalToIterators<PortalType>::IteratorType IteratorType;
|
||||
typename IteratorType::pointer temp = &(*(Iterators.GetBegin()+index));
|
||||
lockedValue = temp;
|
||||
#else
|
||||
lockedValue = (Iterators.GetBegin()+index);
|
||||
#endif
|
||||
lockedValue = static_cast<volatile T*>(temp);
|
||||
return vtkmAtomicAdd(lockedValue, value);
|
||||
#else
|
||||
T* lockedValue;
|
||||
lockedValue = (Iterators.GetBegin()+index);
|
||||
return vtkmAtomicAdd(lockedValue, value);
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
@ -333,50 +335,55 @@ private:
|
||||
typedef vtkm::cont::ArrayPortalToIterators<PortalType> IteratorsType;
|
||||
IteratorsType Iterators;
|
||||
|
||||
#if defined(VTKM_MSVC) //MSVC atomics
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Int32 vtkmAtomicAdd(volatile vtkm::Int32 *address, const vtkm::Int32 &value) const
|
||||
{
|
||||
return InterlockedExchangeAdd(address,value);
|
||||
}
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Int64 vtkmAtomicAdd(volatile vtkm::Int64 *address, const vtkm::Int64 &value) const
|
||||
{
|
||||
return InterlockedExchangeAdd64(address,value);
|
||||
}
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::UInt32 vtkmAtomicAdd(volatile vtkm::UInt32 *address, const vtkm::UInt32 &value) const
|
||||
{
|
||||
return InterlockedExchangeAdd(address,value);
|
||||
}
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::UInt64 vtkmAtomicAdd(volatile vtkm::UInt64 *address, const vtkm::UInt64 &value) const
|
||||
{
|
||||
return InterlockedExchangeAdd64(address,value);
|
||||
}
|
||||
|
||||
#else //gcc built-in atomics
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Int32 vtkmAtomicAdd(vtkm::Int32 *address, const vtkm::Int32 &value) const
|
||||
{
|
||||
#if defined(VTKM_MSVC)
|
||||
long msValue = value;
|
||||
volatile long * msPtr = (volatile long *) address;
|
||||
return InterlockedExchangeAdd(msPtr,msValue);
|
||||
#else
|
||||
return __sync_fetch_and_add(address,value);
|
||||
#endif
|
||||
}
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Int64 vtkmAtomicAdd(vtkm::Int64 *address, const vtkm::Int64 &value) const
|
||||
{
|
||||
#if defined(VTKM_MSVC)
|
||||
long long msValue = value;
|
||||
volatile long long * msPtr = (volatile long long *) address;
|
||||
return InterlockedExchangeAdd64(msPtr,msValue);
|
||||
#else
|
||||
return __sync_fetch_and_add(address,value);
|
||||
#endif
|
||||
}
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::UInt32 vtkmAtomicAdd(vtkm::UInt32 *address, const vtkm::UInt32 &value) const
|
||||
{
|
||||
#if defined(VTKM_MSVC)
|
||||
unsigned long msValue = value;
|
||||
volatile unsigned long * msPtr = (volatile unsigned long *) address;
|
||||
return InterlockedExchangeAdd(msPtr,msValue);
|
||||
#else
|
||||
return __sync_fetch_and_add(address,value);
|
||||
#endif
|
||||
}
|
||||
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::UInt64 vtkmAtomicAdd(vtkm::UInt64 *address, const vtkm::UInt64 &value) const
|
||||
{
|
||||
#if defined(VTKM_MSVC)
|
||||
long long msValue = value;
|
||||
volatile long long * msPtr = (volatile long long *) address;
|
||||
return InterlockedExchangeAdd64(msPtr,msValue);
|
||||
#else
|
||||
|
||||
return __sync_fetch_and_add(address,value);
|
||||
#endif
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user