RFR (S/M) expose L1_data_cache_line_size for diagnostic/sanity checks (8049717)
Daniel D. Daugherty
daniel.daugherty at oracle.com
Fri Jul 11 16:09:59 UTC 2014
Vladimir, thanks for the thorough review.
On 7/10/14 1:07 PM, Vladimir Kozlov wrote:
> Hi Dan
>
> vm_version_sparc.cpp:
>
> I don't know where you get 16 byte cache line size:
That would be covered by the comments:
263 if (is_sun4v()) {
264 assert(_L1_data_cache_line_size == 0, "overlap with sun4v
family");
265 // All Niagara's are sun4v's, but not all sun4v's are Niagaras.
266 //
267 // Ref: UltraSPARC T1 Supplement to the UltraSPARC
Architecture 2005
268 // Appendix F.1.3.1 Cacheable Accesses
269 //
270 // Ref: UltraSPARC T2: A Highly-Threaded, Power-Efficient,
SPARC SOC
271 // Section III: SPARC Processor Core
272 //
273 // Ref: Oracle's SPARC T4-1, SPARC T4-2, SPARC T4-4, and SPARC
T4-1B Server Architecture
274 // Section SPARC T4 Processor Cache Architecture
275 _L1_data_cache_line_size = 16;
276 }
Unfortunately, I can no longer find the T4 L1 cache line size in
that last reference. Either I dreamed it or that doc has been
tweaked since I previously looked at it. I googled around again,
but I can't find a good reference for the T4 L1 cache line size.
>
> /usr/sbin/prtpicl -v |grep l1-dcache |more
> :l1-dcache-line-size 32
> :l1-dcache-size 16384
> :l1-dcache-associativity 4
I'm guessing the above is a from a 'T4' or newer machine.
And by the example from these machines:
$ uname -a
SunOS dr-evil 5.10 Generic_142900-03 sun4v sparc SUNW,Sun-Fire-T1000
$ /usr/sbin/prtpicl -v | grep l1-dcache-line-size | sort -u
:l1-dcache-line-size 16
$ uname -a
SunOS mrspock 5.10 Generic_141444-09 sun4v sparc SUNW,T5440
$ /usr/sbin/prtpicl -v | head -1000 | grep l1-dcache-line-size | sort -u
:l1-dcache-line-size 16
prtpicl seems to go on and on and on on mrspock... hence 'head -1000'
$ uname -a
SunOS terminus 5.11 11.0 sun4u sparc SUNW,SPARC-Enterprise
$ /usr/sbin/prtpicl -v | grep l1-dcache-line-size | sort -u
:l1-dcache-line-size 0x40
> It is 32 for T4 and for T7 it will be larger:
>
> static intx prefetch_data_size() {
> return is_T4() && !is_T7() ? 32 : 64; // default prefetch block
> size on sparc
> }
OK. So T1 and T2 have 16-byte L1 cache line sizes. Is there a T3?
T4 and T5 have 32-byte L1 cache lines sizes. Is there a T6?
T7 and newer have 64-byte cache line sizes.
Can I repeat (from a different e-mail thread) that SPARC really
needs the equivalent of CPUID?
> sun4v could be defined for Fujitsu Sparc64 too:
>
> static bool is_niagara(int features) {
> // 'sun4v_m' may be defined on both Sun/Oracle Sparc CPUs as well as
> // on Fujitsu Sparc64 CPUs, but only Sun/Oracle Sparcs can be
> 'niagaras'.
> return (features & sun4v_m) != 0 && (features & sparc64_family_m)
> == 0;
So are the three distinct SPARC 64-bit families better stated as
(where the Niagara family has three different L1 cache line sizes):
is_ultra3() // 64-byte L1 cache line size
is_niagara()
is_T7() // 64-byte L1 cache line size
else is_T4() // 32-byte L1 cache line size
else /* T[12] */ // 16-byte L1 cache line size
is_sparc64() // 64-byte L1 cache line size
> vm_version_x86.hpp, vm_version_x86.cpp
>
> I would like to keep cpuid bit access in .hpp file.
> I would suggest to keep code prefetch_data_size() but may be rename it
> as L1_line_size() so that you have in .hpp:
>
> static intx L1_line_size() {
> intx result = 0;
> if (is_intel()) {
> result = (_cpuid_info.dcp_cpuid4_ebx.bits.L1_line_size + 1);
> } else if (is_amd()) {
> result = _cpuid_info.ext_cpuid5_ecx.bits.L1_line_size;
> }
> if (result < 32) // not defined ?
> result = 32; // 32 bytes by default on x86 and other x64
> return result;
> }
>
> static intx prefetch_data_size() {
> return L1_line_size();
> }
>
> and in .cpp for > i486 (i486 code is still yours):
>
> _L1_data_cache_line_size = L1_line_size();
Sure, I can move the CPUID bit stuff back into the .hpp file.
I'll do the rename and make prefetch_data_size() a wrapper
call to L1_line_size().
> objectMonitor.cpp and synchronizer.cpp:
>
> cast to 'int' but destination is 'unsigned' (also you can use 'uint'):
>
> unsigned int offset_stwRandom = (int)
I'll check that out.
> combine two 'if (verbose)' into one.
I'll check that out also.
Dan
>
> On 7/9/14 9:42 AM, Daniel D. Daugherty wrote:
>> Greetings,
>>
>> I have the fix for the following bug ready for JDK9 RT_Baseline:
>>
>> JDK-8049717 expose L1_data_cache_line_size for diagnostic/sanity
>> checks
>> https://bugs.openjdk.java.net/browse/JDK-8049717
>>
>> Here is the URL for the webrev:
>>
>> http://cr.openjdk.java.net/~dcubed/8049717-webrev/0-jdk9-hs-rt/
>>
>> This fix is a standalone piece from my Contended Locking reorder
>> and cache-line bucket. I've split it off as an independent bug fix
>> in order to make the reorder and cache-line bucket more clear.
>>
>> Testing:
>>
>> - JPRT test jobs
>> - manual testing of the new output via existing options:
>> -XX:+UnlockExperimentalVMOptions -XX:SyncKnobs=Verbose=1
>> -XX:+ExecuteInternalVMTests -XX:+VerboseInternalVMTests
>> - Aurora Adhoc nsk.sajdi and vm.parallel_class_loading as part of
>> testing for my Contended Locking reorder and cache-line bucket
>>
>> Thanks, in advance, for any comments, questions or suggestions.
>>
>> Dan
>>
>>
More information about the hotspot-runtime-dev
mailing list