[llvm-dev] RFC: make calls "convergent" by default
Sameer Sahasrabuddhe via llvm-dev
llvm-dev at lists.llvm.org
Wed Jun 2 21:26:45 PDT 2021
James Y Knight writes:
>
>> 2. D69498 will be updated so that the convergent property is made
>> default, but the new requirements on CPU frontends will be retracted.
>
>
> If I understand correctly, this means the Clang frontend will no longer
> need to add any convergent NOR noconvergent attributes. Instead, LLVM
> analysis passes can infer the new noconvergent attribute as appropriate.
> And on non-GPU platforms, the analysis can be skipped, and the optimization
> passes can simply ignore convergence attributes, because the hardware has
> no operations which can observe convergence. (So, it doesn't matter whether
> a function is marked noconvergent or not.)
>
> Which is to say: this proposal should make things *easier* for "naive"
> frontends, not harder. By default, a reasonable thing should happen when
> the frontend does nothing -- both on GPU platforms and non-GPU platforms.
> Especially if all of the code is in a single module (e.g., via LTO), there
> will be few calls to unknown destinations, so noconvergent can be inferred
> basically everywhere that is not *in fact* dependent on convergence.
This is more or less the intention, but I would reword it at follows:
- Frontends are no longer required to add a convergent or noconvergent
attribute if all they seek is correct execution on GPUs.
- A frontend or a suitable optimization may add the noconvergent
attribute to gain performance where it can prove that the execution of
the call or callee is not sensitive to which threads are executing
such a call.
- The convergence property is never "ignored" ... it is now built into
LLVM itself. But optimizations may rely on additional knowledge such
as divergence analysis to reason about whether a particular control
flow transformation is safe. This is not an explicitly target-specific
definition. It just so happens that on CPUs, there is no divergent
control flow, and hence it is "as if" the default convergent property
has no effect.
- This use of divergence analysis also benefits GPUs. For example, the
current implementation of sinking always bails out on a convergent
call. In reality, a convergent call can be sunk across a uniform
(non-divergent) branch. This is disallowed by the current overly
conservative definition of convergent, but will be allowed by the new
definition.
Sameer.
More information about the llvm-dev
mailing list