[LLVMdev] [ptx] Propose a register class naming convention change

Justin Holewinski justin.holewinski at gmail.com
Fri May 13 13:39:08 PDT 2011


2011/5/13 Dan Bailey <drb at dneg.com>

>  Justin Holewinski wrote:
>
> On Fri, May 13, 2011 at 5:11 AM, Dan Bailey <drb at dneg.com> wrote:
>
>> That's fine with me. Unless there's a particular reason for it I would
>> suggest perhaps changing the immediate syntax as well to swap it round, so
>> it would be Immi32, Immi64, Immf32, etc. It doesn't bother me that much the
>> way it currently is, but when there are lots of operations taking a register
>> and an immediate, representing them in the same way might be a little more
>> consistent?
>>
>> Personally, I think I also might prefer an underscore to make it more
>> readable for new users (Reg_u32, Reg_pred, Imm_i32, Imm_f32, etc). That's
>> maybe just my own preference, so feel free to do it as you've suggested!
>>
>> Dan
>
>
>  I've been considering the way registers are represented in the PTX
> back-end quite a bit lately, and I think we need to re-consider the way we
> handle registers in the PTX back-end.  As is, we assume a fixed register set
> of typed and sized registers, which is more-or-less what the LLVM code
> generation framework expects.  However, PTX is really a special-case target
> in that the register space is "infinite" and not really typed (yes, PTX
> allows register types, but I do not believe that is mandatory).  The
> infinite nature of the register space gives us a few problems:
>
>    1. We are currently constrained by the number of registers we specify
>    in PTXRegisterInfo.td
>    2. The LLVM register allocators are not really solving the right
>    problem
>    3. We miss opportunities for register re-use
>
> I'm sure there are more, but those are the ones I am thinking of now.
>
>  To solve (1) (and (3) to some degree), I propose we get rid of register
> types and instead use .b{16, 32, 64} and .pred as our register classes.  I
> cannot think of a case where specifying a register class (u32, f32, etc.) is
> required.  In fact, manually modifying my own PTX code to always use .b*
> registers has not affected anything.  This would both simplify the back-end
> and allow the LLVM register allocator to re-use registers across different
> data types (may or may not be a win depending on how good the ptxas register
> allocator is).
>
> Yep, definitely let's do this! I tried to do something similar before, but
> didn't realise the operand types and register types didn't have to match.
> That'll surely improve our register reuse. The only minor disadvantage I can
> see is that the resulting ptx will be a little cryptic to debug, but that's
> not an issue.
>

I'm probably going to get started on this over the weekend.  Che-Liang,
since I will be re-writing most of the register code anyway, I'll go ahead
and change to the new naming convention.


>
> As for the register allocation, I'm not familiar enough to be able to
> comment on the feasibility either, but the second option sounds like the
> preferred one.
>
> Dan
>
>  Solving (2) seems to be a much more difficult problem.  The current
> implementation of register allocation assumes a fixed register space, and
> allocates registers as best as it can while introducing spill code when it
> has to.  For PTX, the problem is a bit different.  Instead, we should assume
> an infinite register space and *minimize* the number of registers required
> *without* introducing spill code.  It is the responsibility of ptxas to do
> the final register allocation and spill code creation.  I see two potential
> solutions to this:
>
>    1. Keep the current fixed register space and emit spill code that
>    really just adds an additional register and copies data between registers
>    for spills
>    2. Implement a new register allocation strategy that ties into the
>    existing infrastructure to satisfy our requirements
>
> Solution (1) seems the easiest to implement, but I worry that ptxas may not
> be able to interpret what is really happening.  I believe doing PTX-level
> register allocation is at least partially responsible for the speed-ups I
> have observed when comparing against nvcc-generated code.  That leaves (2)
> as the preferred method, but I do not know enough about the inner-workings
> of the LLVM register allocations to properly assess how difficult this would
> be.
>
>  Any thoughts?
>
>  By the way, I'm perfectly okay with the name change :)
>
>
>>
>>
>> Che-Liang Chiou wrote:
>>
>>> Hi,
>>>
>>> Current register class naming has a confusing prefix letter 'R' (it is
>>> my bad), such as the first 'R' of RRegu32 (for unsigned 32-bit
>>> registers).
>>>
>>> I propose a 'Reg' + type name naming convention for register classes;
>>> such as:
>>>  Regu16, Regu32, Regf32, Regf64
>>> With one exception for predicate registers (capitalized first letter of
>>> 'pred'):
>>>  RegPred
>>>
>>> Since predicate registers are special in the way that they can't be
>>> passed as arguments or load from/store to memory, I think a little
>>> name convention exception for it is okay.
>>>
>>> What do you think?
>>>
>>> If no objection, I will start making the change.
>>>
>>> Regards,
>>> Che-Liang
>>>
>>>
>>>
>>
>
>
> --
>
> Thanks,
>
>  Justin Holewinski
>
>


-- 

Thanks,

Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110513/c728ea06/attachment.html>


More information about the llvm-dev mailing list