On Fri, 17 Sep 2021 14:00:44 GMT, Scott Gibbons 
<github.com+6704669+asgibb...@openjdk.org> wrote:

>> Change the default code entry alignment to 64 bytes from 32 bytes.  This 
>> allows for maintaining proper 64-byte alignment of data within a code 
>> segment, which is required by several AVX-512 instructions.
>> 
>> I ran into this while implementing Base64 encoding and decoding.  Code 
>> segments which were allocated with the address mod 32 == 0 but with the 
>> address mod 64 != 0 would cause the align() macro to misalign.  This is 
>> because the align macro aligns to the size of the code segment and not the 
>> offset of the PC.  So align(64) would align the PC to a multiple of 64 bytes 
>> from the start of the segment, and not to a pure 64-byte boundary as 
>> requested.  Changing the alignment of the segment to 64 bytes fixes the 
>> issue.
>> 
>> I have not seen any measurable difference in either performance or memory 
>> usage with the tests I have run.
>> 
>> See [this 
>> ](https://mail.openjdk.java.net/pipermail/hotspot-dev/2021-August/054180.html)
>>  article for the discussion thread.
>
> I think I have not made the point clearly enough.  The `align` function is 
> used to manipulate the address bits for the byte following the `align()`.  
> This means that wherever the code is copied, the address of that byte should 
> have the appropriate address bit configuration in the copy (as well as the 
> original, of course).  Since the current implementation is using the base 
> address of the allocated segment to determine alignment, the only way to 
> ensure the proper bit configuration of the address is to ensure the base 
> address of the newly-allocated segment is aligned identically to the original.
> 
> I believe this is entirely independent of `MaxVectorSize`, so I don't believe 
> it's appropriate to use this value for address alignment.  Using `pc()` fixes 
> the case in the source segment, but will break 50% of the time when the 
> segment is copied with a `CodeEntryAlignment` of 32.
> 
> I think the bottom line is that `align()` is broken for any value greater 
> than `CodeEntryAlignment`.  I can foresee a case where it may be beneficial 
> (from an algorithm perspective) to have large alignment values, like 
> align(256) to simplify pointer arithmetic (for example).  All of these 
> proposed changes will not ensure this alignment when a segment is copied.
> 
> Perhaps the appropriate thing to do is to put an `assert()` in `align()` to 
> fail if the requested alignment cannot be ensured?
> 
> IMHO, the "right" thing to do is to mark the bytes requiring address 
> alignment and handle the cases on copy.  This would add significant 
> complexity, however.

@asgibbons To me Vladimir Kozlov's suggestion of adding a align64() method 
calling pc() as you originally proposed looks the best. It meets our purpose 
and is limited in scope.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5547

Reply via email to