[llvm-dev] RFC: (Co-)Convergent functions and uniform function parameters
Mehdi Amini via llvm-dev
llvm-dev at lists.llvm.org
Mon Oct 24 12:54:43 PDT 2016
> On Oct 24, 2016, at 12:38 PM, Nicolai Hähnle via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Hi all,
>
> Some brain-storming on an issue with SPMD/SIMT backend support where I think some additional IR attributes would be useful. Sorry for the somewhat long mail; the short version of my current thinking is that I would like to have the following:
>
> 1) convergent: a call to a function with this attribute cannot be moved to have additional control dependencies; i.e., moving it from A to B is only possible if B dominates or post-dominates A.
>
> 2) co-convergent (divergent? for lack of a better name...): a call to a function with this attribute cannot be moved to have _fewer_ control dependencies; i.e., moving it from A to B is only possible if A dominates or post-dominates B.
>
> 3) uniform (for function arguments): transformations are not allowed to introduce additional non-uniformity in this argument.
Can you describe it in terms that are non-SPMD/SIMT?
I.e. I’m not sure that “uniformity” refers to an existing LLVM IR concept.
Thanks,
—
Mehdi
>
> I'd appreciate input on this proposal, e.g. if this can be solved in an easier way or if there are obvious problems with this approach.
>
> Thanks,
> Nicolai
>
> ..........
> In a nutshell, the problem that this intends to solve is that:
>
> %v1 = texelFetch(%sampler, %coord0)
> %v2 = texelFetch(%sampler, %coord1)
> %v = select i1 %cond, vType %v1, %v2
>
> is logically equivalent to and could benefit from being transformed to,
>
> %coord = select i1 %cond, cType %coord0, %coord1
> %v = texelFetch(%sampler, %coord)
>
> but on the other hand
>
> %v1 = texelFetch(%sampler0, %coord)
> %v2 = texelFetch(%sampler1, %coord)
> %v = select i1 %cond, vType %v1, %v2
>
> _must_not_ be transformed to
>
> %s = select i1 %cond, sType %sampler0, %sampler1
> %v = texelFetch(%s, %coord)
>
> because of uniformity restrictions on the first argument of texelFetch.
>
> We currently have a shader that is mis-compiled in the wild because something much like the latter transform is done by SimplifyCFG.[1] There, the equivalent thing happens with phi nodes:
>
> if:
> %v.if = texelFetch(%sampler0, %coord)
> br label %end
>
> else:
> %v.else = texelFetch(%sampler1, %coord)
> br label %end
>
> end:
> %v = phi [ %v.if, %if ], [ %v.else, %else ]
>
> becomes
>
> ...
> end:
> %s = phi [ %sampler0, %if ], [ %sampler1, %else ]
> %v = texelFetch(%s, %coord)
>
> I have collected some more examples at [2]
>
> The distinctions between all three attribute types mentioned above makes sense, because there are OpenGL shader intrinsics that naturally carry almost all of the possible combinations of those attributes.
>
> That said, a pass that is not SPMD/SIMT-aware must treat every function call that has a uniform argument as if it were co-convergent, because the input to the uniform argument could have non-uniformity whose structure correlates with control dependencies; see [2] for an example. Furthermore, I have not yet found an operation that needs the co-convergent attribute without also having uniform arguments. So for the purposes of LLVM, it may be sufficient to add the 'uniform' attribute for function arguments.
>
>
> [1] https://bugs.freedesktop.org/show_bug.cgi?id=97988
> [2] http://nhaehnle.blogspot.de/2016/10/compiling-shaders-dynamically-uniform.html
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list