Skip to content

Aksinya-Bykova/Integral-OMP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

C++17, GCC 11.4.0 (Release -O3), OpenMP 2.0

Linux Ubuntu 22.04

model name: AMD Ryzen 5 4500U with Radeon Graphics

CPU(s): 6

Thread(s) per core: 1

ОписаниС:

Π—Π°Π΄Π°Ρ‡Π°

Π”Π°Π½Π° Ρ„ΠΈΠ³ΡƒΡ€Π° piriform с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ a = 2.
НСобходимо ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΡ‘ΠΌ этой Ρ„ΠΈΠ³ΡƒΡ€Ρ‹. Π’ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ это ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π² Ρ„ΠΈΠ³ΡƒΡ€Ρƒ ΠΈ находят ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π»Π΅ΠΆΠΈΡ‚ Ρ„ΠΈΠ³ΡƒΡ€Π° (рСализация этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π»Π΅ΠΆΠΈΡ‚ Π² hit.cpp). ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайныС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄Π° ΠΈ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈ Π²Π½Π΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹. Π”ΠΎΠΌΠ½ΠΎΠΆΠΈΠ² это Π½Π° ΠΎΠ±ΡŠΡ‘ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄Π°, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΡ‘ΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹

Π£Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π² Wolfram. Π― сдСлала Π΅Ρ‘ Π³Ρ€Π°Ρ„ΠΈΠΊ Π² ДСсмосС, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ я ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл

Xor Shift Random

  • Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° основС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ XOR ΠΈ сдвигов (Xorshift).
  • Π˜ΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… состояния (seed_a ΠΈ seed_b), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ roll_2_7_3. Π― сдСлала Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΡ‚ Π΄Π²ΡƒΡ… сидов вмСсто классичСской ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. Π’ΠΎΠ²Π°Ρ€ΠΈΡ‰ΠΈ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ говорят, Ρ‡Ρ‚ΠΎ это ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ качСство Ρ€Π°Π½Π΄ΠΎΠΌΠ°
  • ΠžΠ±Π»Π°Π΄Π°Π΅Ρ‚ срСдними статистичСскими свойствами
  • ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрый (здСсь срСдний ΠΏΠΎ скорости)

LCG Random

  • Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ конгруэнтный Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ (LCG)
  • Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅: state = 1664525 * state + 1013904223
  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ числа ΠΏΡƒΡ‚Π΅ΠΌ сдвига Π±ΠΈΡ‚ΠΎΠ² ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΡ… для получСния Π΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ значСния Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, 1)
  • Быстрый, Π½ΠΎ с нСдостатками Π² статистичСских свойствах (нСбольшой ΠΏΠ΅Ρ€ΠΈΠΎΠ΄, коррСляция ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями)

mt19937_random

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл Mersenne Twister (std::mt19937)
  • Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ (seed)
  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ числа с Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌ распрСдСлСниСм Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅
  • Π­Ρ‚ΠΎΡ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΠΈ статистичСскими свойствами, ΠΈΠΌΠ΅Π΅Ρ‚ большой ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ (ΠΎΠΊΠΎΠ»ΠΎ 2^19937-1), ΠΈ Π·Π° счёт этого ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ высокой точности

ВсС Ρ‚Ρ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° умСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² этой Π·Π°Π΄Π°Ρ‡Π΅, эмпиричСски ΠΎΠ½ΠΈ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΡ‘ΠΌ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ сотых

Π’ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ просили ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ самый быстрый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ исслСдований. По ΠΌΠΎΠΈΠΌ исслСдованиям LCG Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ самый быстрый. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ calculate Π² main.cpp, помСняв Ρ‚ΠΈΠΏ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ шаблонной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вычислСния ΠΎΠ±ΡŠΡ‘ΠΌΠ°. Π£Π²Ρ‹, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ постоянно приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ компромиссы. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ

Π― выставила Ρ€Π΅ΠΆΠΈΠΌ release -O3

Π’ части ΠΊΠΎΠ΄Π° с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ€Π°Π½Π΄ΠΎΠΌΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ я мСняла Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Для большого количСства Ρ‚ΠΎΡ‡Π΅ΠΊ это ΠΎΠΊ

False sharing

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссоров Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ кэш-Π±ΡƒΡ„Π΅Ρ€ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ высокоскоростными рСгистрами процСссора. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ячСйкС памяти ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ памяти (строка кэша), содСрТащий Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ячСйку памяти, копируСтся Π² кэш. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ссылки Π½Π° Ρ‚Ρƒ ΠΆΠ΅ ячСйку памяти ΠΈΠ»ΠΈ Π½Π° Ρ‚Π΅, Ρ‡Ρ‚ΠΎ находятся рядом с Π½Π΅ΠΉ, вСроятно, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΈΠ· кэша Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° систСма Π½Π΅ Ρ€Π΅ΡˆΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ кэшСм ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.

Однако ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов ΠΎΠ΄Π½ΠΎΠΉ строки кэша, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰Π΅Π΅ ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… процСссоров, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Ρ†Π΅Π»Ρ‹Ρ… строк кэша, Π΄Π°ΠΆΠ΅ Ссли эти обновлСния логичСски нСзависимы Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. КаТдоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта строки кэша ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ строку ΠΊΠ°ΠΊ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ процСссоры, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ элСмСнту Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС, видят, Ρ‡Ρ‚ΠΎ строка ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ. Они Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡΠ²Π΅ΠΆΡƒΡŽ копию строки ΠΈΠ· памяти ΠΈΠ»ΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ мСста, Π΄Π°ΠΆΠ΅ Ссли элСмСнт, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ, Π½Π΅ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ кэша поддСрТиваСтся Π½Π° основС кэш-Π»ΠΈΠ½ΠΈΠΉ, Π° Π½Π΅ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ увСличиваСтся Ρ‚Ρ€Π°Ρ„ΠΈΠΊ мСТсоСдинСний ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠΊΠ° ΠΈΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ кэш-Π»ΠΈΠ½ΠΈΠΈ, доступ ΠΊ элСмСнтам Π² этой Π»ΠΈΠ½ΠΈΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½.

Вакая ситуация называСтся false sharing. Если это происходит часто, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ OpenMP-прилоТСния Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ½ΠΈΠΆΠ°ΡŽΡ‚ΡΡ.

False sharing сниТаСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ссли ΠΈΠΌΠ΅ΡŽΡ‚ мСсто всС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ условия.

  1. ΠžΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ нСсколькими процСссорами.
  2. НСсколько процСссоров ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС кэша.
  3. Π­Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ происходит ΠΎΡ‡Π΅Π½ΡŒ часто (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΡƒΠ·ΠΊΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅).

ДокумСнтация Oracle "What Is False Sharing?"

ΠŸΡ€ΠΎΡΡ‚Ρ‹ΠΌΠΈ словами: всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ хотят ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ кэш, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π΅Π³ΠΎ приходится постоянно ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· памяти, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΈ это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ нашСм случаС Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΈ это ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎΡ‚ случай, ΠΊΠΎΠ³Π΄Π° слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° false sharing (см. послСдний Π°Π±Π·Π°Ρ† Ρ†ΠΈΡ‚Π°Ρ‚Ρ‹)

Π’Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· Ρ‚Π΅Ρ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ³Ρ€Π°ΡŽΡ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прилоТСния, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ false sharing. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС false sharing ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Ρ‘ΠΌ

  1. максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ использования ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…;
  2. использования ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ компилятора для устранСния Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сохранСния памяти.

Π’ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаях влияниС false sharing ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² этом случаС false sharing ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мСньшС.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΠΎΡ€ΡŒΠ±Ρ‹ с false sharing Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ зависят ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ способа распрСдСлСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ false sharing. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ отобраТСния ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ, прСдоставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ большСго объСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° Ρ‡Π°Π½ΠΊ (ΠΏΡƒΡ‚Π΅ΠΌ измСнСния значСния chunksize) Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ false sharing.

ДокумСнтация Oracle "Reducing False Sharing"

ΠŸΠΎΡΡ‚Π°Ρ€Π°Π΅ΠΌΡΡ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΉ способ распрСдСлСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ chunk_size

Race condition

Race condition Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ памяти Π±Π΅Π· синхронизации. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ памяти ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

  1. Для избСТания false sharing я ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΎΠ΄Π½Ρƒ структуру
  2. Для избСТания race condition я сдСлала Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ экзСмпляры Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π˜Π½Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ асинхронно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ экзСмпляром. Π’ΠΎ Π΅ΡΡ‚ΡŒ я сдСлала Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» свой Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π― ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡƒΡ‡Π΅ΡΡ‚ΡŒ процСссоры, Π³Π΄Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ кэш-Π»ΠΈΠ½ΠΈΠΈ Π½Π΅ 64. Π’ случаС с линуксом это ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π° Π²ΠΈΠ½Π΄Π΅ поставила 64 (ΠΈΠ»ΠΈ Ссли Π½Π° линуксС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ кэш-Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π½Π΅ сработаСт). Π­Ρ‚ΠΎ Π½Π΅ ошибка, просто ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΡƒΠΆΠ΅

Π’Π΄Ρ€ΡƒΠ³ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° своём спСцифичСском ΠΆΠ΅Π»Π΅Π·Π΅? Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄ Π² CMake ΠΈ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ константу

// constexpr size_t CACHE_LINE_SIZE = 64
set(CACHE_LINE_SIZE 64)

if (UNIX)
    execute_process(
            COMMAND getconf LEVEL1_DCACHE_LINESIZE
            OUTPUT_VARIABLE CACHE_LINE_SIZE
            OUTPUT_STRIP_TRAILING_WHITESPACE
            ERROR_VARIABLE GETCONF_ERROR
    )
endif ()

ΠžΠ±Π·ΠΎΡ€ OpenMP

#pragma omp parallel опрСдСляСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, которая являСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Π­Ρ‚ΠΎ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ конструкция, которая запускаСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

ДокумСнтация OpenMP p.8

Π’ΠΎ Π΅ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ я ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽ участок, ΠΎΡ‚ΠΊΡƒΠ΄Π° начнётся ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ num_threads Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ число ΠΏΠΎΡ‚ΠΎΠΊ (ΠΊΠ°ΠΊ попросили Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ ΠΈΠ»ΠΈ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ выставлСно Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)

#pragma omp parallel num_threads(threads)

#pragma omp for schedule ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для распрСдСлСния ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ†ΠΈΠΊΠ»Π° for ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ области

dynamic Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Π½Π΅ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π·Π°Ρ€Π°Π½Π΅Π΅. ВмСсто этого, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ своСй Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ

static Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° выполнСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ,

Π­Ρ‚ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ слСдуСт Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π² зависимости ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ. ДинамичСскоС распрСдСлСниС ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π±Π΅Π· Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹, Π·Π°Ρ‚ΠΎ статичСскоС распрСдСлСниС позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° распрСдСлСниС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π²ΠΎ врСмя выполнСния. Π’ΠΎ Π΅ΡΡ‚ΡŒ static ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ссли ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ врСмя, Π° dynamic Ссли Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ - Π½Π΅ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅

chunk_size опрСдСляСт количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·

If the optional chunk_size is set, the value must be positive. If chunk_size is not set, a value of 1 is assumed, except in the case of a static schedule. For a static schedule, the default chunk size is set to the loop iteration space divided by the number of threads applied to the loop.

ДокумСтация OpenMP p.48

Π― это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, здСсь, ΠΊΠΎΠ³Π΄Π° ΡΡ‡ΠΈΡ‚Π°ΡŽ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ ΠΈ дСлаю ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ попадания Ρ‚ΠΎΡ‡ΠΊΠΈ Π² piriform Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°

#pragma omp for schedule(static)
        for (long long i = 0; i < num_points; ++i) {
            if (hit_test(point.x, point.y, point.z)) {
                ++local_count_inside;
            }
            if (i % 3 == 0) { point.x = local_rt.next_float(axis_range[0], axis_range[1]); }
            if (i % 3 == 1) { point.y = local_rt.next_float(axis_range[2], axis_range[3]); }
            if (i % 3 == 2) { point.z = local_rt.next_float(axis_range[4], axis_range[5]); }
        }

ΠšΡ€ΠΎΠΌΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Ρ€Π°Π½Π΅Π΅ Π±ΠΎΡ€ΡŒΠ±Ρ‹ с race conditition стоит Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ atomic ΠΏΡ€ΠΈ подсчётС суммы ΠΏΠΎΠΏΠ°Π²ΡˆΠΈΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ

The atomic directive ensures that a specific memory location is updated atomically, rather than exposing it to the possibility of multiple, simultaneous writing threads.

ДокумСнтация OpenMP p.19

To avoid race conditions, all updates of the location in parallel should be protected with the atomic directive, except those that are known to be free of race conditions

ДокумСнтация OpenMP p.20

ΠŸΠΎΠ΄Π±ΠΎΡ€ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°

ВсС ΠΌΠΎΠΈ ΠΏΠΎΡ‚ΡƒΠ³ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ research

Π― сдСлала Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² main(): самый быстрый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ исслСдования (calculate) ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, описанный Π² Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€ΠΌΠ΅Ρ‚Ρ€Π°Ρ… обучСния ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅

Π― запускала ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· bash-скрипт Π·Π°Ρ€Π°Π½Π΅Π΅ выставлСнноС число Ρ€Π°Π·. Π― ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅ Π½Π° C++, Π½ΠΎ это Π½Π΅ совсСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ‚Π΅ΠΌ самым ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ врСмя выполнСния (Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ я выставила агрСссивный Ρ€Π΅ΠΆΠΈΠΌ -O3). Π’ΠΎ Π΅ΡΡ‚ΡŒ это Π½Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ просят Π² Π·Π°Π΄Π°Π½ΠΈΠΈ. ВсС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π² txt-Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΏΠΎΡ‚ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅

Π― Π΄Π΅Π»Π°Π»Π° ΠΏΠΎ 100 ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ я оставила Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ research. Π’ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ записывала срСднСС арифмСтичСскоС ΠΈ строила Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅

Анализ

Π’Π°ΠΆΠ½ΠΎ! ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ смысл ΠΈΠΌΠ΅Π½Π½ΠΎ для ΠΌΠΎΠ΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Ρƒ мСня всСгда ΠΈΠ΄Ρ‘Ρ‚ доТдь Π·Π° ΠΎΠΊΠ½ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° я Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΈ этот доТдь влияСт Π½Π° ΠΌΠΎΡ‘ ΠΆΠ΅Π»Π΅Π·ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ я этого Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°ΡŽ)

ВрСмя выполнСния (ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ) ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ возрастании числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² - Π΄ΠΎ количСства ядСр. А Ρ‡Ρ‚ΠΎ дальшС? Π£ мСня Π½Π΅Ρ‚ Π³ΠΈΠΏΠ΅Ρ€Ρ‚Ρ€Π΅Π΄ΠΈΠ½Π³Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ

> lscpu
Thread(s) per core:   1

Π“ΠΈΠΏΠ΅Ρ€Ρ‚Ρ€Π΅Π΄ΠΈΠ½Π³ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π­Ρ‚Π° тСхнология позволяСт ΠΎΠ΄Π½ΠΎΠΌΡƒ физичСскому ядру процСссора Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Ρ‚Π°ΠΊΠΎΠ΅ ядро выглядит ΠΊΠ°ΠΊ Π΄Π²Π° логичСских ядра, Ρ‡Ρ‚ΠΎ позволяСт процСссору ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Но это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ увСличится Ρ€ΠΎΠ²Π½ΠΎ Π² Π΄Π²Π° Ρ€Π°Π·Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ физичСски эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ Π·Π° ΠΎΠ±Ρ‰ΠΈΠ΅ рСсурсы. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ρƒ мСня Π½Π΅Ρ‚ Π³ΠΈΠΏΠ΅Ρ€Ρ‚Ρ€Π΅Π΄ΠΈΠ½Π³Π°, поэтому Π½Π° количСствС ядСр всё ΠΈ остановится

Под chunk_size=0 я ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽ отсутствиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° chunk_size

Xor Shift Random

XOR SHIFT RANDOM Dynamic Static no omp
742.1273400000001
threads=1 chunk_size=0 959.1870700000001 647.5335600000001
threads=1 chunk_size=1 977.4376000000001 738.4600399999997
threads=1 chunk_size=2 798.97356 693.8203500000001
threads=1 chunk_size=4 706.7744299999999 667.9802800000001
threads=1 chunk_size=8 662.3845100000002 669.9193300000001
threads=1 chunk_size=16 656.89602 671.99949
threads=1 chunk_size=1024 616.1506799999999 608.1179800000003
threads=1 chunk_size=65536 616.2857799999998 607.48229
threads=2 chunk_size=0 3063.832100000001 375.62092999999993
threads=2 chunk_size=1 3087.6666999999993 425.81378000000007
threads=2 chunk_size=2 1872.4175 403.21542999999986
threads=2 chunk_size=4 1199.14824 387.57298000000014
threads=2 chunk_size=8 827.06555 377.26754999999997
threads=2 chunk_size=16 578.0699399999999 386.9205300000002
threads=2 chunk_size=1024 311.30982 306.94826000000006
threads=2 chunk_size=65536 314.162 308.7052300000001
threads=3 chunk_size=0 2305.7704 271.76511
threads=3 chunk_size=1 2377.2187 429.7632899999998
threads=3 chunk_size=2 1485.7054999999998 342.46197
threads=3 chunk_size=4 927.9267 307.3826700000002
threads=3 chunk_size=8 606.9004800000001 292.34443999999996
threads=3 chunk_size=16 431.55013999999983 298.5801100000001
threads=3 chunk_size=1024 213.46932000000007 212.34223999999986
threads=3 chunk_size=65536 217.80307000000002 213.75945000000004
threads=4 chunk_size=0 2396.8017 231.64429
threads=4 chunk_size=1 2620.621200000001 429.7632899999998
threads=4 chunk_size=2 1432.1845999999998 342.46197
threads=4 chunk_size=4 808.5284399999999 307.3826700000002
threads=4 chunk_size=8 486.8980600000001 292.34443999999996
threads=4 chunk_size=16 350.4992300000002 298.5801100000001
threads=4 chunk_size=1024 175.40966999999998 175.07930000000005
threads=4 chunk_size=65536 174.02857999999992 173.56111999999996
threads=5 chunk_size=0 1791.7743000000005 194.55849
threads=5 chunk_size=1 1942.3265000000008 225.41342000000003
threads=5 chunk_size=2 1069.51909 212.69293
threads=5 chunk_size=4 625.14891 198.58798999999988
threads=5 chunk_size=8 428.2980999999999 195.64558999999997
threads=5 chunk_size=16 298.40604999999994 201.25531000000007
threads=5 chunk_size=1024 146.30154000000002 150.98498000000006
threads=5 chunk_size=65536 148.59708999999998 148.56091000000004
threads=6 chunk_size=0 1717.5671000000016 174.36667999999997
threads=6 chunk_size=1 1924.5363999999993 262.64434999999986
threads=6 chunk_size=2 1122.6137000000003 202.47624
threads=6 chunk_size=4 630.2659500000001 190.31953000000004
threads=6 chunk_size=8 402.14745000000005 174.93008999999998
threads=6 chunk_size=16 275.02544 184.60392
threads=6 chunk_size=1024 132.39290000000003 129.79215
threads=6 chunk_size=65536 138.29397000000006 131.54746
XOR SHIFT RANDOM Dynamic Static no omp
742.1273400000001
threads=1 chunk_size=0 959.1870700000001 647.5335600000001
threads=2 chunk_size=0 3063.832100000001 375.62092999999993
threads=3 chunk_size=0 2305.7704 271.76511
threads=4 chunk_size=0 2396.8017 231.64429
threads=5 chunk_size=0 1791.7743000000005 194.55849
threads=6 chunk_size=0 1717.5671000000016 174.36667999999997
xor-shift-fig1.png
Рис. 1. ВрСмя выполнСния ΠΎΡ‚ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘Π΅Π· chunk_size, Xor Shift Random
XOR SHIFT RANDOM Dynamic Static
threads=1 616.1506799999999 608.1179800000003
threads=2 311.30982 306.94826000000006
threads=3 213.46932000000007 212.34223999999986
threads=4 174.02857999999992 173.56111999999996
threads=5 146.30154000000002 148.56091000000004
threads=6 132.39290000000003 129.79215
xor-shift-fig2.png
Рис. 2. ВрСмя выполнСния ΠΎΡ‚ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π›ΡƒΡ‡ΡˆΠΈΠΉ chunk_size, Xor Shift Random
XOR SHIFT RANDOM Dynamic Static no omp
742.1273400000001
threads=1 chunk_size=0 959.1870700000001 647.5335600000001
threads=1 chunk_size=1 977.4376000000001 738.4600399999997
threads=1 chunk_size=2 798.97356 693.8203500000001
threads=1 chunk_size=4 706.7744299999999 667.9802800000001
threads=1 chunk_size=8 662.3845100000002 669.9193300000001
threads=1 chunk_size=16 656.89602 671.99949
threads=1 chunk_size=1024 616.1506799999999 608.1179800000003
threads=1 chunk_size=65536 616.2857799999998 607.48229
xor-shift-fig3.png
Рис. 3. ВрСмя выполнСния с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OpenMP ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Xor Shift Random
xor-shift-fig4.png
Рис. 4. ВрСмя выполнСния с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OpenMP ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Xor Shift Random
XOR SHIFT RANDOM Dynamic Static no omp
* * * 742.1273400000001
* 132.39290000000003 * *
* * 129.79215 *

ВрСмя выполнСния Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Xor Shift Random

LCG

LCG Dynamic Static no omp
320.21758999999986
threads=1 chunk_size=0 720.32038 363.2665499999998
threads=1 chunk_size=1 721.4270099999999 438.8332000000001
threads=1 chunk_size=2 529.3780300000002 401.88604
threads=1 chunk_size=4 434.1517700000001 381.61602000000005
threads=1 chunk_size=8 399.45808000000005 372.3880299999999
threads=1 chunk_size=16 376.54825000000005 368.36753
threads=1 chunk_size=1024 357.08664 363.04133
threads=1 chunk_size=65536 360.12431999999995 363.7118000000001
threads=2 chunk_size=0 2471.1630000000005 208.9217299999999
threads=2 chunk_size=1 2575.7833999999993 208.93125000000003
threads=2 chunk_size=2 1221.4701699999996 188.90817000000004
threads=2 chunk_size=4 797.6244300000002 182.03506999999993
threads=2 chunk_size=8 567.7238500000002 169.82162
threads=2 chunk_size=16 431.08428999999984 175.37787000000003
threads=2 chunk_size=1024 186.0359300000001 168.70204
threads=2 chunk_size=65536 184.91643999999997 166.0188900000001
threads=3 chunk_size=0 2224.300499999999 120.28897999999995
threads=3 chunk_size=1 2201.985899999999 150.89968999999996
threads=3 chunk_size=2 1230.0265000000002 132.64675
threads=3 chunk_size=4 750.6885999999998 125.04092999999997
threads=3 chunk_size=8 499.1914499999998 122.43509999999993
threads=3 chunk_size=16 287.27097 119.50589000000005
threads=3 chunk_size=1024 130.20472999999998 120.94409
threads=3 chunk_size=65536 127.81734999999995 121.37797999999995
threads=4 chunk_size=0 2485.205099999999 101.20989799999998
threads=4 chunk_size=1 2538.766599999999 122.02588
threads=4 chunk_size=2 1359.5470999999995 111.48121799999998
threads=4 chunk_size=4 743.9374599999999 106.04796499999999
threads=4 chunk_size=8 450.92199 104.52965400000001
threads=4 chunk_size=16 262.336 102.01833800000003
threads=4 chunk_size=1024 141.11465000000007 101.10425599999995
threads=4 chunk_size=65536 138.87098999999995 100.127789
threads=5 chunk_size=0 1900.0151999999998 86.25729800000003
threads=5 chunk_size=1 1905.2843000000005 104.41016199999996
threads=5 chunk_size=2 1002.7346199999998 95.590499
threads=5 chunk_size=4 677.9435499999998 90.91517100000003
threads=5 chunk_size=8 392.9684800000003 88.73768799999999
threads=5 chunk_size=16 240.95204999999996 87.66330700000005
threads=5 chunk_size=1024 116.69940699999998 88.02471699999998
threads=5 chunk_size=65536 116.467575 86.61003499999998
threads=6 chunk_size=0 1883.1092000000003 75.05852899999995
threads=6 chunk_size=1 1887.4066999999998 100.74184199999998
threads=6 chunk_size=2 1011.23479 89.44294300000001
threads=6 chunk_size=4 612.3865099999997 83.60841299999998
threads=6 chunk_size=8 328.4400100000001 81.92129200000001
threads=6 chunk_size=16 224.26999 79.43605899999997
threads=6 chunk_size=1024 99.36119700000003 80.245992
threads=6 chunk_size=65536 105.26176199999998 81.105628
LCG Dynamic Static no omp
320.21758999999986
threads=1 chunk_size=0 720.32038 363.2665499999998
threads=2 chunk_size=0 2471.1630000000005 208.9217299999999
threads=3 chunk_size=0 2224.300499999999 120.28897999999995
threads=4 chunk_size=0 2485.205099999999 101.20989799999998
threads=5 chunk_size=0 1900.0151999999998 86.25729800000003
threads=6 chunk_size=0 1883.1092000000003 75.05852899999995
lcg-fig5.png
Рис. 5. ВрСмя выполнСния ΠΎΡ‚ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘Π΅Π· chunk_size, LCG
LCG Dynamic Static no omp
320.21758999999986
threads=1 357.08664 363.04133
threads=2 184.91643999999997 166.0188900000001
threads=3 127.81734999999995 119.50589000000005
threads=4 138.87098999999995 100.127789
threads=5 116.467575 86.25729800000003
threads=6 99.36119700000003 75.05852899999995
lcg-fig6.png
Рис. 6. ВрСмя выполнСния ΠΎΡ‚ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π›ΡƒΡ‡ΡˆΠΈΠΉ chunk_size, LCG
LCG Dynamic Static no omp
320.21758999999986
threads=1 chunk_size=0 720.32038 363.2665499999998
threads=1 chunk_size=1 721.4270099999999 438.8332000000001
threads=1 chunk_size=2 529.3780300000002 401.88604
threads=1 chunk_size=4 434.1517700000001 381.61602000000005
threads=1 chunk_size=8 399.45808000000005 372.3880299999999
threads=1 chunk_size=16 376.54825000000005 368.36753
threads=1 chunk_size=1024 357.08664 363.04133
threads=1 chunk_size=65536 360.12431999999995 363.7118000000001
lcg-fig7.png
Рис. 7. ВрСмя выполнСния с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OpenMP ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, LCG
lcg-fig8.png
Рис. 8. ВрСмя выполнСния с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OpenMP ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, LCG
LCG Dynamic Static no omp
* * * 320.21758999999986
* 99.36119700000003 * *
* * 75.05852899999995 *

ВрСмя выполнСния Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, LCG

Mersenne

MERSENNE Dynamic Static no omp
956.23506
threads=1 chunk_size=0 1459.2138000000004 979.6839999999996
threads=1 chunk_size=1 1457.8219000000004 1155.4581000000005
threads=1 chunk_size=2 1228.0756 1038.6444999999994
threads=1 chunk_size=4 1094.0227 1002.3167000000001
threads=1 chunk_size=8 1038.6502 991.3661299999997
threads=1 chunk_size=16 1012.1187000000001 983.51205
threads=1 chunk_size=1024 981.8386800000001 977.4677800000002
threads=1 chunk_size=65536 980.7897299999997 977.4954800000005
threads=2 chunk_size=0 2454.2849 491.3553899999998
threads=2 chunk_size=1 2528.3521000000005 579.8482200000001
threads=2 chunk_size=2 1112.3551 519.2280599999999
threads=2 chunk_size=4 896.71071 506.45614
threads=2 chunk_size=8 878.1847200000001 510.72994000000006
threads=2 chunk_size=16 667.4337100000001 498.85919
threads=2 chunk_size=1024 497.7303399999999 493.83408000000003
threads=2 chunk_size=65536 496.75344999999993 491.04488
threads=3 chunk_size=0 2324.007899999999 333.45305
threads=3 chunk_size=1 2309.6744444444444 389.06447999999983
threads=3 chunk_size=2 1360.4386000000002 360.83767000000006
threads=3 chunk_size=4 893.5689899999999 359.1863900000001
threads=3 chunk_size=8 594.2066099999998 340.91036999999983
threads=3 chunk_size=16 443.92572 336.71448
threads=3 chunk_size=1024 336.041 333.66865000000007
threads=3 chunk_size=65536 333.34274000000005 331.6086
threads=4 chunk_size=0 2427.310400000001 269.15664999999996
threads=4 chunk_size=1 2428.913600000001 317.30904999999996
threads=4 chunk_size=2 1388.6960000000004 279.70716
threads=4 chunk_size=4 810.2486000000001 277.3220599999999
threads=4 chunk_size=8 505.85546 275.49273999999997
threads=4 chunk_size=16 354.39224 271.93818000000016
threads=4 chunk_size=1024 266.44991999999996 267.71892
threads=4 chunk_size=65536 334.1695 268.95080999999993
threads=5 chunk_size=0 2072.469200000001 228.36536
threads=5 chunk_size=1 2090.6867999999995 258.4376400000001
threads=5 chunk_size=2 1144.2234999999996 238.52624
threads=5 chunk_size=4 708.6009300000001 235.39597
threads=5 chunk_size=8 400.67623 233.64247000000006
threads=5 chunk_size=16 299.5613299999999 228.9460399999999
threads=5 chunk_size=1024 225.77935999999997 228.24191999999988
threads=5 chunk_size=65536 226.09871000000007 228.16843
threads=6 chunk_size=0 1770.0350999999998 198.31024000000005
threads=6 chunk_size=1 1787.8928999999991 230.82468
threads=6 chunk_size=2 1042.1054999999997 214.63073000000003
threads=6 chunk_size=4 641.47724 217.35527000000005
threads=6 chunk_size=8 353.3799500000001 202.06297000000006
threads=6 chunk_size=16 264.3303200000001 201.3278
threads=6 chunk_size=1024 204.2944299999999 209.72317999999984
threads=6 chunk_size=65536 205.00369000000012 208.20205000000013
MERSENNE Dynamic Static no omp
956.23506
threads=1 chunk_size=0 1459.2138000000004 979.6839999999996
threads=2 chunk_size=0 2454.2849 491.3553899999998
threads=3 chunk_size=0 2324.007899999999 333.45305
threads=4 chunk_size=0 2427.310400000001 269.15664999999996
threads=5 chunk_size=0 2072.469200000001 228.36536
threads=6 chunk_size=0 1770.0350999999998 198.31024000000005
mersenne-fig9.png
Рис. 9. ВрСмя выполнСния ΠΎΡ‚ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘Π΅Π· chunk_size, Mersenne
MERSENNE Dynamic Static no omp
956.23506
threads=1 980.7897299999997 977.4954800000005
threads=2 496.75344999999993 491.04488
threads=3 333.34274000000005 331.6086
threads=4 266.44991999999996 267.71892
threads=5 225.77935999999997 228.16843
threads=6 204.2944299999999 198.31024000000005
mersenne-fig10.png
Рис. 10. ВрСмя выполнСния ΠΎΡ‚ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π›ΡƒΡ‡ΡˆΠΈΠΉ chunk_size, Mersenne
MERSENNE Dynamic Static no omp
956.23506
threads=1 chunk_size=0 1459.2138000000004 979.6839999999996
threads=1 chunk_size=1 1457.8219000000004 1155.4581000000005
threads=1 chunk_size=2 1228.0756 1038.6444999999994
threads=1 chunk_size=4 1094.0227 1002.3167000000001
threads=1 chunk_size=8 1038.6502 991.3661299999997
threads=1 chunk_size=16 1012.1187000000001 983.51205
threads=1 chunk_size=1024 981.8386800000001 977.4677800000002
threads=1 chunk_size=65536 980.7897299999997 977.4954800000005
mersenne-fig11.png
Рис. 11. ВрСмя выполнСния с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OpenMP ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Mersenne
mersenne-fig12.png
Рис. 12. ВрСмя выполнСния с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ OpenMP ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Mersenne
MERSENNE Dynamic Static no omp
956.23506
* * 198.31024000000005
* 204.2944299999999 *

Как ΠΈ оТидалось, static Π² Ρ†Π΅Π»ΠΎΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π» Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ врСмя Π½Π° распрСдСлСниС вычислСний ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ - ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ извСстноС количСство. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅, это ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ. Но ΠΊΠ°ΠΊ я ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»Π°, это Π²Π΅Ρ€Π½ΠΎ Π½Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всСгда, Π² ΠΈΠ½ΠΎΠΌ случаС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ dynamic

Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ оТидалось ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle, ΠΏΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ chunk_size ускоряСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. УмСньшСниС false sharing - это Ρ…ΠΎΡ€ΠΎΡˆΠΎ

Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ отобраТСния ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ, прСдоставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ большСго объСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° Ρ‡Π°Π½ΠΊ (ΠΏΡƒΡ‚Π΅ΠΌ измСнСния значСния chunksize) Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ false sharing.

ДокумСнтация Oracle "Reducing False Sharing"

Π’ Π½Π°Ρ‡Π°Π»Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΏΡ€ΠΈ ΠΌΠ°Π»Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΈ ΠΌΠ°Π»Ρ‹Ρ… chunk_size ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΠ»ΠΎΡ…ΠΎ: это связано с Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ расходами Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ 1024 ΠΈ 65536 Ρ‡Π°Π½ΠΊΠ°ΠΌΠΈ измСнСния ΡƒΠΆΠ΅ нСсущСствСнныС ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΡƒΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, достигаСтся ΠΏΡ€ΠΈ максимальном числС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

По Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² случаС static отсутствиС указания Ρ‡Π°Π½ΠΊΠΎΠ² ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ нСбольшого количСства Ρ‡Π°Π½ΠΊΠΎΠ². Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ static ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ставит Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ 1, Π° число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ†ΠΈΠΊΠ»Π°, Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π½Π° количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… ΠΊ Ρ†ΠΈΠΊΠ»Ρƒ. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ для dynamic Π΅ΡΡ‚ΡŒ чёткая взаимосвязь: большС Ρ‡Π°Π½ΠΊΠΎΠ² - Π»ΡƒΡ‡ΡˆΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ Π½Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 1

Если ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Ρ‚ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎ скорости:

  1. LCG
  2. Xor Shift Random
  3. Mersenne

Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ LCG содСрТит ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ вычислСний, Xor Shift Random Ρ‡ΡƒΡ‚ΡŒ побольшС, Π½ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ Ρ†ΠΈΠΊΠ»Π° Π½Π° 19 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… сдвигов Π² Π½Ρ‘ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅Ρ‚, Π° Mersenne Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»Π³ΠΎ

Π›ΡƒΡ‡ΡˆΠΈΠΉ усрСднённый Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 75 мс ΠΏΡ€ΠΈ static, threads=6, Π±Π΅Π· chunk_size

ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ количСствС Ρ‡Π°Π½ΠΊΠΎΠ² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 80 мс, Ρ‡Ρ‚ΠΎ довольно Π±Π»ΠΈΠ·ΠΊΠΎ

About

Multithreading C++

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published