Skip to content

Commit

Permalink
Fix_msvc_atomics (#61)
Browse files Browse the repository at this point in the history
* Fix MSVC build.
  • Loading branch information
AlexVlx committed Mar 19, 2024
1 parent 50954af commit e112c93
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 18 deletions.
29 changes: 20 additions & 9 deletions include/hip/hip_atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ unsigned long atomicAdd(unsigned long* address, unsigned long val) noexcept
}

inline
unsigned long long atomicAdd(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicAdd(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_add(address, val);
}
Expand Down Expand Up @@ -91,7 +92,8 @@ long long atomicAnd(long long* address, long long val) noexcept
}

inline
unsigned long long atomicAnd(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicAnd(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_and(address, val);
}
Expand All @@ -101,7 +103,9 @@ unsigned long long atomicAnd(unsigned long long* address, unsigned long long val
// FIXME: not available in CUDA or in HIP/ROCm
inline
unsigned short atomicCAS(
unsigned short* address, unsigned short compare, unsigned short val) noexcept
unsigned short* address,
unsigned short compare,
unsigned short val) noexcept
{
return hip::detail::atomic_cas(address, compare, val);
}
Expand Down Expand Up @@ -129,7 +133,9 @@ unsigned long atomicCAS(

inline
unsigned long long atomicCAS(
unsigned long long* address, unsigned long long compare, unsigned long long val) noexcept
unsigned long long* address,
unsigned long long compare,
unsigned long long val) noexcept
{
return hip::detail::atomic_cas(address, compare, val);
}
Expand Down Expand Up @@ -165,7 +171,8 @@ unsigned long atomicExch(unsigned long* address, unsigned long val) noexcept
}

inline
unsigned long long atomicExch(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicExch(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_exchange(address, val);
}
Expand Down Expand Up @@ -213,7 +220,8 @@ long long atomicMax(long long* address, long long val) noexcept
}

inline
unsigned long long atomicMax(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicMax(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_max(address, val);
}
Expand Down Expand Up @@ -246,7 +254,8 @@ long long atomicMin(long long* address, long long val) noexcept
}

inline
unsigned long long atomicMin(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicMin(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_min(address, val);
}
Expand Down Expand Up @@ -306,7 +315,8 @@ unsigned long atomicSub(unsigned long* address, unsigned long val) noexcept
}

inline
unsigned long long atomicSub(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicSub(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_sub(address, val);
}
Expand Down Expand Up @@ -340,7 +350,8 @@ long long atomicXor(long long* address, long long val) noexcept
}

inline
unsigned long long atomicXor(unsigned long long* address, unsigned long long val) noexcept
unsigned long long atomicXor(
unsigned long long* address, unsigned long long val) noexcept
{
return hip::detail::atomic_xor(address, val);
}
Expand Down
20 changes: 11 additions & 9 deletions src/include/hip/detail/atomic_msvc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@ namespace hip
T atomic_add(T* p, T v) noexcept
{
using U = std::conditional_t<
std::is_same_v<T, long> || std::is_same_v<T, unsigned long> ||
std::is_same_v<T, long long>,
std::is_same_v<T, long> || std::is_same_v<T, long long>,
T,
std::conditional_t<sizeof(T) == sizeof(long), long, long long>>;

if constexpr (std::is_same_v<T, U>) {
return _InterlockedExchangeAdd(p, v);
if constexpr (sizeof(T) == sizeof(long)) {
return _InterlockedExchangeAdd(p, v);
}
else return _InterlockedExchangeAdd64(p, v);
}
else if constexpr (sizeof(U) == sizeof(long)) {
return bit_cast<T>(_InterlockedExchangeAdd(
Expand All @@ -49,13 +51,15 @@ namespace hip
T atomic_cas(T* p, T cmp, T v) noexcept
{
using U = std::conditional_t<
std::is_same_v<T, long long> ||
std::is_same_v<T, unsigned long> || std::is_same_v<T, long>,
std::is_same_v<T, long> || std::is_same_v<T, long long>,
T,
std::conditional_t<sizeof(T) == sizeof(long), long, long long>>;

if constexpr (std::is_same_v<T, U>) {
return _InterlockedCompareExchange(p, v, cmp);
if constexpr(sizeof(T) == sizeof(long)) {
return _InterlockedCompareExchange(p, v, cmp);
}
else return _InterlockedCompareExchange64(p, v, cmp);
}
else if constexpr (sizeof(T) == sizeof(long)) {
return bit_cast<T>(_InterlockedCompareExchange(
Expand Down Expand Up @@ -157,9 +161,7 @@ namespace hip
T atomic_exchange(T* p, T v) noexcept
{
using U = std::conditional_t<
std::is_same_v<T, long> ||
std::is_same_v<T, unsigned long> ||
std::is_same_v<T, long long>,
std::is_same_v<T, long> || std::is_same_v<T, long long>,
T,
std::conditional_t<sizeof(T) == sizeof(long), long, long long>>;

Expand Down

0 comments on commit e112c93

Please sign in to comment.