Skip to content

Commit

Permalink
vulkan: argsort: barriers must be under uniform control flow
Browse files Browse the repository at this point in the history
a return before a barrier leads to UB.
While the old code actually works on some devices,
it fails on some others (i.e. "smaller" GPUs).

BTW, I think it would be better if it was possible to set
specialization constants when the graph is built,
in that way the local workgroup could be sized
appropriately.

Signed-off-by: Salvatore Mesoraca <[email protected]>
  • Loading branch information
smeso committed Sep 7, 2024
1 parent 10e83a4 commit 26058cf
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions src/vulkan-shaders/argsort.comp
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,18 @@ void main() {
const int col = int(gl_LocalInvocationID.x);
const uint row = gl_WorkGroupID.y;

if (col >= p.ncols_pad) {
return;
}

const uint row_offset = row * p.ncols;

// initialize indices
dst_row[col] = col;
if (col < p.ncols_pad) {
dst_row[col] = col;
}
barrier();

for (uint k = 2; k <= p.ncols_pad; k *= 2) {
for (uint j = k / 2; j > 0; j /= 2) {
const uint ixj = col ^ j;
if (ixj > col) {
if (col < p.ncols_pad && ixj > col) {
if ((col & k) == 0) {
if (dst_row[col] >= p.ncols ||
(dst_row[ixj] < p.ncols && (p.order == ASC ?
Expand Down

0 comments on commit 26058cf

Please sign in to comment.