diff --git a/catch/performance/warpSync/warpSync.cc b/catch/performance/warpSync/warpSync.cc index 2e67d8c506..e5c232d188 100644 --- a/catch/performance/warpSync/warpSync.cc +++ b/catch/performance/warpSync/warpSync.cc @@ -98,7 +98,8 @@ template class Op> __global__ void reduceAllAtomics(T* __restrict__ output, const T* __restrict__ input, unsigned long long mask) { int idx = threadIdx.x + blockIdx.x * kBlockDim; - __shared__ T result[kBlockDim / warpSize]; // one per warp + extern __shared__ uint8_t shared_mem[]; + T* result = reinterpret_cast(shared_mem); // one per warp Op op; int numWarp = threadIdx.x / warpSize; @@ -158,19 +159,24 @@ public: dim3 blockDim = { kBlockDim }; dim3 gridDim = { static_cast(std::ceil(numItems / static_cast(blockDim.x))) }; + hipDeviceProp_t props; + HIP_CHECK(hipGetDeviceProperties(&props, 0)); + int warpSize = props.warpSize; + int numWarpsPerBlock = kBlockDim / warpSize; + size_t sharedSize = numWarpsPerBlock * sizeof(T); TIMED_SECTION(kTimerTypeEvent) { if constexpr (std::is_same, std::plus>::value) - reduceAllAtomics<<>>(output, input, mask); + reduceAllAtomics<<>>(output, input, mask); else if constexpr (std::is_same, MinOp>::value) - reduceAllAtomics<<>>(output, input, mask); + reduceAllAtomics<<>>(output, input, mask); else if constexpr (std::is_same, MaxOp>::value) - reduceAllAtomics<<>>(output, input, mask); + reduceAllAtomics<<>>(output, input, mask); else if constexpr (std::is_same, std::logical_and>::value) - reduceAllAtomics<<>>(output, input, mask); + reduceAllAtomics<<>>(output, input, mask); else if constexpr (std::is_same, std::logical_or>::value) - reduceAllAtomics<<>>(output, input, mask); + reduceAllAtomics<<>>(output, input, mask); else if constexpr (std::is_same, XorOp>::value) - reduceAllAtomics<<>>(output, input, mask); + reduceAllAtomics<<>>(output, input, mask); else static_assert(std::is_void::value, "Unsupported operator");