Skip to content

Commit

Permalink
lgc: fix wrong thread id when group size Y/Z is 1 (GPUOpen-Drivers#2812)
Browse files Browse the repository at this point in the history
* lgc: fix wrong thread id when group size Y/Z is 1

tidigCompCnt is set to 0 when y and z are 1 and 1 when z is 1. In the
random failed case, the group size is 1x1x1, so the y and z ids are just
random values.
  • Loading branch information
xazhangAMD authored Nov 11, 2023
1 parent 86ca151 commit 4320b9c
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions lgc/patch/PatchEntryPointMutate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ void PatchEntryPointMutate::lowerGroupMemcpy(GroupMemcpyOp &groupMemcpyOp) {
// The local invocation ID is packed to VGPR0 on GFX11+ with the following layout:
//
// +-----------------------+-----------------------+-----------------------+
// | Local Invocation ID Z | Local Invocation ID Y | Local Invocation ID Z |
// | Local Invocation ID Z | Local Invocation ID Y | Local Invocation ID X |
// | [29:20] | [19:10] | [9:0] |
// +-----------------------+-----------------------+-----------------------+
// localInvocationIdZ = localInvocationId[29:20]
Expand All @@ -391,9 +391,13 @@ void PatchEntryPointMutate::lowerGroupMemcpy(GroupMemcpyOp &groupMemcpyOp) {

// LocalInvocationIndex is
// (LocalInvocationId.Z * WorkgroupSize.Y + LocalInvocationId.Y) * WorkGroupSize.X + LocalInvocationId.X
threadIndex = builder.CreateMul(threadIdComp[2], builder.getInt32(workgroupSize[1]));
threadIndex = builder.CreateAdd(threadIndex, threadIdComp[1]);
threadIndex = builder.CreateMul(threadIndex, builder.getInt32(workgroupSize[0]));
// tidigCompCnt is not always 3 if groupSizeY and/or groupSizeZ are 1. See RegisterMetadataBuilder.cpp.
threadIndex = builder.getInt32(0);
if (workgroupSize[2] > 1)
threadIndex = builder.CreateMul(threadIdComp[2], builder.getInt32(workgroupSize[1]));
if (workgroupSize[1] > 1)
threadIndex =
builder.CreateMul(builder.CreateAdd(threadIndex, threadIdComp[1]), builder.getInt32(workgroupSize[0]));
threadIndex = builder.CreateAdd(threadIndex, threadIdComp[0]);
}
} else {
Expand Down

0 comments on commit 4320b9c

Please sign in to comment.