[llvm-dev] Is there a way to know the target's L1 data cache line size?

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Sat Mar 11 05:53:10 PST 2017


On 03/11/2017 06:41 AM, Hadrien G. via llvm-dev wrote:
> Thank you! Is this information available programmatically through some 
> LLVM API, so that next time some hardware manufacturer does some crazy 
> experiment, my code can be automatically compatible with it as soon as 
> LLVM is?

Yes, using TargetTransformInfo, you can call TTI->getCacheLineSize(). 
Not all targets provide this information, however, and as Bruce pointed 
out, there are environments where this does not make sense ( caveat emptor).

  -Hal

>
> Le 11/03/2017 à 13:38, Bruce Hoult a écrit :
>> PowerPC G5 (970) and all recent IBM Power have 128 byte cache lines. 
>> I believe Itanium is also 128.
>>
>> Intel has stuck with 64 recently with x86, at least at L1. I believe 
>> multiple adjacent lines may be combined into a "block" (with a single 
>> tag) at L2 or higher in some of them.
>>
>> ARM can be 32 or 64.
>>
>>
>>
>> On Sat, Mar 11, 2017 at 3:24 PM, Hadrien G. <knights_of_ni at gmx.com 
>> <mailto:knights_of_ni at gmx.com>> wrote:
>>
>>     I guess that in this case, what I would like to know is a
>>     reasonable upper bound of the cache line size on the target
>>     architecture. Something that I can align my data structures on at
>>     compile time so as to minimize the odds of false sharing. Think
>>     std::hardware_destructive_interference_size in C++17.
>>
>>
>>     Le 11/03/2017 à 13:16, Bruce Hoult a écrit :
>>>     There's no way to know, until you run on real hardware. It could
>>>     be different every time the binary is run. You have to ask the
>>>     OS or hardware, and that's system dependent.
>>>
>>>     The cache line size can even change in the middle of the program
>>>     running, for example if your program is moved between a "big"
>>>     and "LITTLE" core on ARM. In this case the OS is supposed to lie
>>>     to you and tell you the smallest of the cache line sizes (but
>>>     that can only work if cache line operations are non-estructive!
>>>     No "zero cache line" or "throw away local changes in cache line"
>>>     like on PowerPC). It also means that you might not places things
>>>     far enough apart to be on different cache lines on the bigger
>>>     core, and so not acheive the optimal result you wanted. It's a mess!
>>>
>>>
>>>     On Sat, Mar 11, 2017 at 2:13 PM, Hadrien G. via llvm-dev
>>>     <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>>
>>>         Hi everyone,
>>>
>>>         I'm hailing from the Rust community, where there is a
>>>         discussion about adding facilities for aligning data on an
>>>         L1 cache line boundary. One example of situation where this
>>>         is useful is when building thread synchronization
>>>         primitives, where avoiding false sharing can be a critical
>>>         concern.
>>>
>>>         Now, when it comes to implementation, I have this gut
>>>         feeling that we probably do not need to hardcode every
>>>         target's cache line size in rustc ourselves, because there
>>>         is probably a way to get this information directly from the
>>>         LLVM toolchain that we are using. Is my gut right on this
>>>         one? And can you provide us with some details on how it
>>>         should be done?
>>>
>>>         Thanks in advance,
>>>         Hadrien
>>>         _______________________________________________
>>>         LLVM Developers mailing list
>>>         llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>>>         http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>         <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>>>
>>>
>>
>>
>>     -- 
>>     This message has been scanned for viruses and
>>     dangerous content by *MailScanner*
>>     <http://www.mailscanner.info/>, and is
>>     believed to be clean.
>>
>>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170311/a0e02acb/attachment.html>


More information about the llvm-dev mailing list