SWDEV-420237 - Fix reduce sync operations when masks are divergent (#181)

Do not use __ockl_activelane_u32() to calculate the index of the lane within the mask, as that would not work with divergent masks that have other bits on before the associated lane.

[ROCm/clr commit: 1a8d766836]
Bu işleme şunda yer alıyor:
Hernandez, Gerardo
2025-04-22 15:17:58 +01:00
işlemeyi yapan: GitHub
ebeveyn 41c4bea0f5
işleme ba5a9a5395
+1 -2
Dosyayı Görüntüle
@@ -373,6 +373,7 @@ __device__ inline T __reduce_op_sync(MaskT mask, T val, BinaryOp op, WfReduce wf
// the number of bits in the mask is a power of 2
numIterations -= 1;
maskIdx = __popcll(((1ul << laneId) - 1) & mask);
mask >>= laneId;
mask >>= 1ul;
@@ -381,8 +382,6 @@ __device__ inline T __reduce_op_sync(MaskT mask, T val, BinaryOp op, WfReduce wf
else
__builtin_memcpy(&result, &val, sizeof(T));
maskIdx = __ockl_activelane_u32();
// add the values from the lanes using a reduction tree (first the threads with even-numbered
// lanes, then multiples of 4, then 8, ...
while (numIterations) {