рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХреИрд╢ рд╡рд┐рд╢реЗрд╖рддрд╛: рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛

рдХреИрд╢ рдореЗрдореЛрд░реА рдХреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд▓рдХреНрд╖рдг рд╡рд░реНрдгрди рдкрд░ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ред lmbench



рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╡рд╣реА рддреАрди рдЧреНрд░рд╛рдлрд╝ рдорд┐рд▓реЗ, рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рддрдиреА рдЬрд╛рдирдХрд╛рд░реА рдЙрдиреНрд╣реЗрдВ рдЦреАрдВрдЪреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХреИрд╢ рдФрд░ рдЯреАрдПрд▓рдмреА рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрди рдЪрд╛рд░реНрдЯреЛрдВ рдХреЛ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ - рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реБрдП рдХрд┐ рд╡реЗ рдХреБрдЫ рдРрд╕рд╛ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЫрд╛рддреНрд░реЛрдВ рдиреЗ рдореБрдЭреЗ рдирд┐рд░рд╛рд╢ рдХрд┐рдпрд╛, рдФрд░ рдЧреНрд░рд╛рдл рдкрд░ рдХрджрдореЛрдВ рдХреА рдврд▓рд╛рди рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдзрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдХреЛ рднреА рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕реЗрдореЗрд╕реНрдЯрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рдмрддрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ; рдФрд░ рдпрд╣ рдХрд┐ рддрдм рддрдХ рдЗрд╕реЗ рднреБрд▓рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХреЗрдЧрд╛, рдореИрдВрдиреЗ рдЙрд╕ рд▓реЗрдЦ рдХреЛ рдХреЛрдбрд╝рд╛ред



рддрдм рдпреЗрдХрд╡рд░ рдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдореИрдиреБрдЕрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдХреИрд╢ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдХреЛрдИ lmbench



рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред) рд╕рдордп рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо __rdtsc



рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЕрдВрддрд┐рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж рд╕реЗ 64-рдмрд┐рдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдШрдбрд╝реА рдЪрдХреНрд░ рджреЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдШрдбрд╝реА рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдФрд░ рдордирдорд╛рдирд╛ рд▓реЛрдб рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдШрдбрд╝реА рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдкрдХрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдШрдбрд╝реА рдХреА рдЧрддрд┐ рд╕реЗ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдШрдбрд╝реА рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред



рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпреЛрдЧ рдХреА рддрд░рд╣, рд╣рдо 4KB рд╕реЗ 512MB рддрдХ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХрд╛ рдбреЗрдЯрд╛ рд▓реЗрдВрдЧреЗ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдФрд╕рдд рдХреЗ рдмрд╛рдж рд▓рд╛рдЦреЛрдВ рдмрд╛рд░ рд╕рд░рдгреА рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред рд▓реЛрдб рдЪрдХреНрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП lat_mem_rd



, рд╣рдо рдСрдкрд░реЗрд╢рди p=(void**)*p;



, рдЬрд┐рд╕реЗ рдПрдХ рдорд╢реАрди рдХрдорд╛рдВрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ 256 рдмрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реМрдЯрдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рджреБрд░реНрд▓рдн рд╣реЛред



рдкреНрд░рдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо рддреАрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрдирдореЗрдВ 10% рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЫрд▓рд╛рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ - рдпреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╣реИрдВред рд╣рдо рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдЪрд░рдг рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬреНрдЮрд╛рдд рдЪрд░рдгреЛрдВ рдХреЛ рд╕рд╣реЗрдЬ рд▓реЗрдВрдЧреЗ, рдФрд░ рд╕рдордп рдорд╛рдкрди рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж рд╣рдо рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдЧреНрд░рд╛рдл рдкрд░ рдЪрд░рдгреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреИрдХ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЪрд░рдгреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рдХреЗ рдмрдЬрд╛рдп рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рддреАрди рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдХреИрд╢ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдбрд╝реЗ рдРрд░реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рдереЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдордп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдбрд┐рд╕реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд, 512 рдПрдордмреА рд╕реЗ рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдХреЛрдИ рдорд╛рдк рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рднрд┐рдиреНрди рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИред



рдкреЗрдВрдЯрд┐рдпрдо 4 630, 1 рдЬреАрдмреА рд░реИрдо
рдШрдбрд╝реА рдХреА рджрд░: 2993 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ

L1 рдЖрдХрд╛рд░: 16 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 4.10 рдЪрдХреНрд░ (1.37 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 2 рдХреЗрдмреА, рдЕрдзрд┐рдХрддрдоред 2 рдХреЗрдмреА

TLB рдХрд╛ рдЖрдХрд╛рд░: 64, рд╡рд┐рд▓рдВрдмрддрд╛: 18.37 рдЪрдХреНрд░ (6.14 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 1, рдЕрдзрд┐рдХрддрдоред 8

L2 рдЖрдХрд╛рд░: 1920 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 28.98 рдЪрдХреНрд░ (9.68 рдПрдирдПрд╕)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 384 рдХреЗрдмреА, рдЕрдзрд┐рдХрддрдоред 384 рдХреЗрдмреА

Core2 T7200, 1GB рд░реИрдо
рдШрдбрд╝реА рдХреА рджрд░: 1995 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ

L1 рдХрд╛ рдЖрдХрд╛рд░: 32 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 3.02 рдЪрдХреНрд░ (1.51 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 8 рдХреЗрдмреА, рдЕрдзрд┐рдХрддрдоред 8 рдХреЗрдмреА

L2 рдХрд╛ рдЖрдХрд╛рд░: 1024 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 14.87 рдЪрдХреНрд░ (7.45 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 256 KB, рдЕрдзрд┐рдХрддрдоред 256 рдХреЗрдмреА

L3 рдХрд╛ рдЖрдХрд╛рд░: 3840 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 14.62 рдЪрдХреНрд░ (7.33 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 2816 рдХреЗрдмреА, рдЕрдзрд┐рдХрддрдоред 2816 рдХреЗрдмреА

Core2 рдбреБрдУ T5250, 1 рдЬреАрдмреА рд░реИрдо
рдШрдбрд╝реА рдХреА рджрд░: 1496 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ

L1 рдЖрдХрд╛рд░: 32 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 3.04 рдЪрдХреНрд░ (2.03 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 8 рдХреЗрдмреА, рдЕрдзрд┐рдХрддрдоред 8 рдХреЗрдмреА

L2 рдХрд╛ рдЖрдХрд╛рд░: 1280 KB, рд╡рд┐рд▓рдВрдмрддрд╛: 14.82 рдЪрдХреНрд░ (9.91 ns)

рд░рд╛рд╕реНрддрд╛ рдХрд╛ рдЖрдХрд╛рд░: рдорд┐рдирдЯред 4 рдХреЗрдмреА, рдЕрдзрд┐рдХрддрдоред 0 рдХреЗрдмреА





рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЯреАрдПрд▓рдмреА рдХреА рдкрд╣реБрдВрдЪ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЕрддрд┐рд░рд┐рдХреНрдд рджреЗрд░реА рдЗрддрдиреА рдорд╣рддреНрд╡рд╣реАрди рдереА рдХрд┐ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕реЗ рдирдЧрдгреНрдп рдкрд╛рдпрд╛ рдФрд░ рдЯреАрдПрд▓рдмреА рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛; рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХреНрд╕реЗрд╕ рдЯрд╛рдЗрдо рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдПрдХ рд╣реА рдХреНрд░рдо рдХреЗ рдкрд░рд┐рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд▓рд╛, рдЬреЛ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рджреЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЯреАрдПрд▓рдмреА рдХреЗ рдПрдХреНрд╕реЗрд╕ рдЯрд╛рдЗрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдирд┐рдпрдорд┐рддрддрд╛ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдПрдХреНрд╕реЗрд╕ рдЯрд╛рдЗрдо рд╢реЗрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рддрдВрддреНрд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред



рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХреИрд╢ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдореБрдлреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ: рдпрд╣ рдкреГрд╖реНрдарднреВрдорд┐ рд▓реЛрдб рджреНрд╡рд╛рд░рд╛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдк рдХреЗ рд╕рдордп рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдмрдВрдж рдХрд░реЗрдВред



 #include <math.h> #include <stdio.h> #include <intrin.h> #include <windows.h> //   :   lat_mem_rd int step(int k) { if(k < 1024) k = k * 2; else if(k < 4*1024) k += 1024; else { int s; for (s = 32*1024; s <= k; s *= 2) ; k += s / 16; } return k; } #define TWICE(x) xx #define MB (1024*1024) int main() { //    LARGE_INTEGER perfcnt1, perfcnt2; __int64 tsc1, tsc2; QueryPerformanceCounter(&perfcnt1); tsc1=__rdtsc(); //  (   ) Sleep(500); //  QueryPerformanceCounter(&perfcnt2); tsc2=__rdtsc(); perfcnt2.QuadPart -= perfcnt1.QuadPart; QueryPerformanceFrequency(&perfcnt1); //  const double MHz = (double)(tsc2-tsc1)*perfcnt1.QuadPart/perfcnt2.QuadPart/1e6; printf("Clock rate: %.0f MHz\n", MHz); //      //      typedef struct segment_t segment; struct segment_t { int size_l, size_r; //  ,   double level, total; //  ,   int width; // ,    segment* next; }; //      typedef struct { int step_size_bytes; segment data; } segments; //     segments allsegs[]={{128}, {256}, {512}, {1024}, {2048}, {4096}, {0}}; for(segments *cursegs = allsegs; int step_size = cursegs->step_size_bytes/sizeof(void*); cursegs++) { printf("\rTesting stride: %d \n", cursegs->step_size_bytes); int iters = 1<<28; //       int state = 0; //   -   segment* curseg = &(cursegs->data); //   //    ,     int a_size_bytes, b_size_bytes; double a, b; //          for(int arr_size_bytes = 1<<12; arr_size_bytes <= 1<<29; arr_size_bytes = step(arr_size_bytes)) { const int arr_size = arr_size_bytes / sizeof(void*); void **x = (void**)malloc(arr_size_bytes); //   //      step_size int k; for(k = 0; k < arr_size; k += step_size) { x[k] = x + k + step_size; } x[k-step_size] = x; const int arr_iters = k / step_size; //     //        if(iters < 4*arr_iters) iters = 4*arr_iters; //         void **p = x; //      const __int64 ticks_start = __rdtsc(); //   --      for(int j = 0; j < iters; j+=256) { TWICE(TWICE(TWICE(TWICE(TWICE(TWICE(TWICE(TWICE( p=(void**)*p; )))))))) } //      const __int64 ticks_end = __rdtsc(); //    ,      //   !!p (),        const double cycles = (double)!!p * (ticks_end-ticks_start) / iters; //   printf("\r%f MB - %.2f cycles ", (double)arr_size_bytes/MB, cycles); free(x); //   //   ,       while(cycles/MHz*iters > 1e6) iters >>= 1; //   ? if(!state && (curseg->width>2) && (fabs(a-curseg->level)<(a*.1)) && (b>(curseg->level*1.1)) && (cycles>(curseg->level*1.1))) { curseg->size_r = a_size_bytes; curseg = curseg->next = (segment*)calloc(1, sizeof(segment)); state = 1; b = 0; //        } //   ? if(state && (fabs(cycles-a)<(a*.1)) && (fabs(cycles-b)<(b*.1))) { curseg->size_l = a_size_bytes; state = 0; } //      if(!state && ((curseg->width<=2) || (fabs(cycles-curseg->level)<cycles*.1))) { curseg->total += cycles; curseg->width++; curseg->level = curseg->total / curseg->width; } //     ? if(!state && (cycles<curseg->level*.9) && (fabs(cycles-a)<(a*.1)) && (fabs(cycles-b)<(b*.1))) { curseg->total = a + b + cycles; curseg->width = 3; curseg->level = curseg->total / curseg->width; } //   a_size_bytes = b_size_bytes; b_size_bytes = arr_size_bytes; a = b; b = cycles; } } //    int TLB = 0; //    -- TLB? for(int cache_level = 1;;cache_level++) { //       int cache_size = allsegs[0].data.size_r, step_count = 0; if(!cache_size) break; //    ( ) double latency, total = 0; if(TLB) //         cache_level--; else latency = allsegs[0].data.level; int less=0, same=0, more=0; //    " " //      for(segments *cursegs = allsegs; cursegs->step_size_bytes; cursegs++) { segment* next = cursegs->data.next; //    if(!next) { //    ,     printf("Missing results for L%d! Step size %d, array size %f MB\n", cache_level, cursegs->step_size_bytes, (double)cursegs->data.size_l/MB); cache_size = 0; break; } //     ,  while(fabs(cursegs->data.level-next->level)<cursegs->data.level*.2) { cursegs->data.size_r = next->size_r; cursegs->data.total += next->total; cursegs->data.width += next->width; cursegs->data.level = cursegs->data.total / cursegs->data.width; cursegs->data.next = next->next; free(next); next = cursegs->data.next; //  if(cursegs==allsegs) { cache_size = cursegs->data.size_r; if(!TLB) latency = cursegs->data.level; } } //       if(cursegs->data.size_r == cache_size) same++; //        else if(cursegs->data.size_r == step(cache_size)) more++; else if(step(cursegs->data.size_r) == cache_size) less++; //     :  TLB else if(cursegs->data.size_r < cache_size/2) { //      --  cache_size = cursegs->data.size_r; more = less = 0; same = 1; //        for(segments *prevsegs = allsegs; prevsegs<cursegs; prevsegs++) { segment* second = (segment*)malloc(sizeof(segment)); *second = prevsegs->data; prevsegs->data.next = second; prevsegs->data.size_r = second->size_l = cache_size; } } //    ,   if(less>same) { cache_size = cursegs->data.size_r; more = same; same = less; less = 0; } else if (more>same) { cache_size = cursegs->data.size_r; less = same; same = more; more = 0; } if(!TLB && fabs(latency-cursegs->data.level)<latency*.1) { total += cursegs->data.level; latency = total / ++step_count; } } if(!cache_size) break; //      //     TLB int min_way_size = 0, max_way_size = 0, next_step_at = 2*cache_size; // ,     TLB double additional = (allsegs[0].data.next->level - latency) / 2; if(additional<0) additional=0; //    TLB = 1; //   TLB,      for(segments *cursegs = allsegs; cursegs->step_size_bytes; cursegs++) { segment* next = cursegs->data.next; //    //    ,     if(cursegs->data.size_r <= cache_size) { if(max_way_size && (max_way_size != next->size_l - cache_size)) { printf("Inconsistent results for L%d! Step size %d, array size %f MB\n", cache_level, cursegs->step_size_bytes, (double)next->size_l/MB); } min_way_size = cursegs->step_size_bytes; //     max_way_size = next->size_l - cache_size; //   --   //    ,      if(next->size_l > step(cache_size)) min_way_size = max_way_size; //   ,     } else if(cursegs->data.size_r > step(cache_size)) { if(cursegs->data.size_r != next_step_at) printf("Inconsistent results for L%d! Step size %d, array size %f MB\n", cache_level, cursegs->step_size_bytes, (double)cursegs->data.size_r/MB); if (!max_way_size) max_way_size = cursegs->step_size_bytes / 2; //       next_step_at *= 2; //        } //   TLB,        double new_additional = cursegs->data.next->level - latency; if((fabs(new_additional - additional*2) < new_additional*.1) || (additional<latency*.1)) additional = new_additional; else //    TLB TLB = 0; //     cursegs->data = *next; free(next); } if(TLB) printf("TLB size: %d, latency: %.2f cycles (%.2f ns)\n" " way size: min. %d, max. %d\n", cache_size/4096, additional/2, (additional/2)/MHz*1000, min_way_size/4096, max_way_size/4096); else printf("L%d size: %d KB, latency: %.2f cycles (%.2f ns)\n" " way size: min. %d KB, max. %d KB\n", cache_level, cache_size/1024, latency, latency/MHz*1000, min_way_size/1024, max_way_size/1024); } return 0; }
      
      






All Articles