Refactoring TBB atomics

This commit is contained in:
Matt Larsen 2016-03-04 10:18:35 -08:00
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
}