SWDEV-530921 - Update warp sync test to not use warpSize at compile time (#184)

Dieser Commit ist enthalten in:
Dittakavi, Satyanvesh
2025-05-22 14:26:39 +05:30
committet von GitHub
Ursprung d1e6f076e2
Commit 0c095130e6
+13 -7
Datei anzeigen
@@ -98,7 +98,8 @@ template <class T, template <typename> 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<T*>(shared_mem); // one per warp
Op<T> op;
int numWarp = threadIdx.x / warpSize;
@@ -158,19 +159,24 @@ public:
dim3 blockDim = { kBlockDim };
dim3 gridDim = { static_cast<uint32_t>(std::ceil(numItems / static_cast<float>(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<Op<T>, std::plus<T>>::value)
reduceAllAtomics<T, AtomicAddOp><<<gridDim, blockDim>>>(output, input, mask);
reduceAllAtomics<T, AtomicAddOp><<<gridDim, blockDim, sharedSize>>>(output, input, mask);
else if constexpr (std::is_same<Op<T>, MinOp<T>>::value)
reduceAllAtomics<T, AtomicMinOp><<<gridDim, blockDim>>>(output, input, mask);
reduceAllAtomics<T, AtomicMinOp><<<gridDim, blockDim, sharedSize>>>(output, input, mask);
else if constexpr (std::is_same<Op<T>, MaxOp<T>>::value)
reduceAllAtomics<T, AtomicMaxOp><<<gridDim, blockDim>>>(output, input, mask);
reduceAllAtomics<T, AtomicMaxOp><<<gridDim, blockDim, sharedSize>>>(output, input, mask);
else if constexpr (std::is_same<Op<T>, std::logical_and<T>>::value)
reduceAllAtomics<T, AtomicAndOp><<<gridDim, blockDim>>>(output, input, mask);
reduceAllAtomics<T, AtomicAndOp><<<gridDim, blockDim, sharedSize>>>(output, input, mask);
else if constexpr (std::is_same<Op<T>, std::logical_or<T>>::value)
reduceAllAtomics<T, AtomicOrOp><<<gridDim, blockDim>>>(output, input, mask);
reduceAllAtomics<T, AtomicOrOp><<<gridDim, blockDim, sharedSize>>>(output, input, mask);
else if constexpr (std::is_same<Op<T>, XorOp<T>>::value)
reduceAllAtomics<T, AtomicXorOp><<<gridDim, blockDim>>>(output, input, mask);
reduceAllAtomics<T, AtomicXorOp><<<gridDim, blockDim, sharedSize>>>(output, input, mask);
else
static_assert(std::is_void<T>::value, "Unsupported operator");