Author: martin fierz
Date: 11:13:10 06/08/01
Go up one level in this thread
On June 08, 2001 at 14:02:53, Robert Hyatt wrote:
>On June 08, 2001 at 12:52:55, martin fierz wrote:
>
>>hi bob,
>>
>>>>Small, local variables in a function do not have cache problems.
>>>>The problem is when you have large tables with data. Then you need to worry
>>>>about how the data is organized.
>>>>
>>>>/Johan Melin
>>>
>>>But they _do_. If you put 8 "small local variables" together in memory,
>>>whenever one is referenced the other 7 will be brought into cache at the same
>>>time. When you use them, you use a cache cycle rather than a memory cycle.
>>>That basically means that the first variable costs you a memory cycle, the
>>>other 7 cost you nothing whatsoever to use.
>>>
>>>Small savings add up over millions of repetitions...
>>
>>if i give you some sample code:
>>
>>int somefunction(int p1)
>> {
>> int x1,x2,x3...x20;
>>
>> x1=something;
>> /* can i assume that now x2..x8 are in my cache?*/
>
>Probably, yes. Although as I mentioned, the ANSI standard does not require
>that the variables be laid out in memory as they are declared. I can't imagine
>it not happening here, of course. But if you mix chars, ints, doubles, etc,
>the compiler would probably shuffle things around unless you put everything in
>a struct... and even then you have slack bytes added for alignment on some
>architectures.
>
>
>
>
>> x5=something;
>> /* and now still x1..x8 because probably x5 was in cache?*/
>
>Yes... but note that a cache line fill comes from a distinct 32-byte block
>of memory. It is difficult to be sure X1 is on a 32 byte address boundry (to
>make sure it is the first word of that 8-word block) without using some sort
>of align directive in assembly.
>
>
>> x12=something else;
>> /* and now x12..x19 are in cache?*/
>> }
>
>
>You got it almost right. Probably x9-x16 will be in cache (32 byte linesize
>remember).
>
>
>>
>>are these comments reasonable? i know you wrote that there is no guarantee
>>that the variables will be allocated this way, but probably this is the best
>>guess i have!?
>>
>>cheers
>> martin
>
>
>That is probably very close except for your mistake in missing that x1-x8 might
>end up in one line together, followed by x9-x16 in another line...
>
>In practice, x1-x8 will probably be in adjacent memory words, but might not be
>in the same cache line if x1 isn't on a 32-byte addressing boundary.
thanks for the explanation - i will try this on sunday...
cheers
martin
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.