SlideShare a Scribd company logo
1 of 67
Download to read offline
Лекция 5:
Многопоточное программирование
Часть 1
(Multithreading programming)
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Уровень параллелизма Аппаратурная реализация Granularity
Параллелизм уровня
инструкций
ILP – Instruction Level Parallelism
Вычислительное ядро процессора
(Processor execution core/engine)
Мелкозернистый
параллелизм
(Fine-grained
parallelism)
Параллелизм уровня потоков
TLP – Thread Level Parallelism
Многоядерный процессор
(Multi-core processor),
многопроцессорная система
с общей памятью (Shared memory
system, SMP/ NUMA)
Крупнозернистый
параллелизм
(Coarse-grained
parallelism)
Параллелизм уровня процессов
PLP – Process Level Parallelism
Вычислительная система
с распределенной памятью
(Distributed memory system)
Уровни параллелизма
22
Одноядерные процессоры (Single-core processors)
33
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-память
(Cache)
Frontend
(Fetch, Decode)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-память
(Cache)
Frontend
(Fetch, Decode)
Состояние ядра
(Architectural State)
Одноядерный процессор
(Single-core processor)
Superscalar pipeline
Out-of-order execution
SIMD instructions
VLIW
Одноядерный
процессор
с поддержкой
одновременной
многопоточности
(Simultaneous
multithreading , SMT)
2 потока разделяют
суперскалярный
конвейер
ILP
ILP
Chip
Chip
Многопроцессорные системы (SMP, NUMA)
44
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-
память
(Cache)
Frontend
(Fetch, Decode)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-
память
(Cache)
Frontend
(Fetch, Decode)
Разделяемая память (Shared memory, RAM)
ILP ILP
TLP/PLP
SMP/NUMA-системы
Процессоры независимы – независимые чипы (chip), установлены в разные
разъемы на системной плате и имеют общий доступ к оперативной памяти
Операционная система предоставляет доступ к совокупности логических
процессоров (logical processors)
Chip Chip
Многоядерные процессоры (Multi-core processors)
55
Процессорные ядра размещены на одном чипе (chip)
Ядра процессора могу разделять некоторые ресурсы
(например, кеш-память)
Операционная система предоставляет доступ к совокупности
логических процессоров (logical processors)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-
память
(Cache)
Frontend
(Fetch, Decode)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP ILP
TLP/PLP
Chip
Многоядерные процессоры (Multi-core processors)
66
Процессорные ядра размещены на одном чипе (chip)
Ядра процессора могу разделять некоторые ресурсы
(например, кеш-память)
Операционная система предоставляет доступ к совокупности
логических процессоров (logical processors)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-
память
(Cache)
Frontend
(Fetch, Decode)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Кеш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP ILP
Chip
Разделяемая кеш-память (Shared cache)
TLP/PLP
Многоядерные процессоры с SMT
77
Многоядерный процессор может поддерживать
одновременную многопоточность (Simultaneous multithreading – SMT,
Intel Hyper-threading, Fujitsu Vertical Multithreading)
Каждое ядро может выполнять несколько потоков на своем
суперскалярном конвейере (2-way SMT, 4-way SMT, 8-way SMT, …)
Операционная система представляет каждый SMT-поток как логический
процессор
Состояние ядра
(Architectural State)
Кеш-
память
(Cache)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Frontend
(Fetch, Decode)
ILP
Состояние ядра
(Architectural State)
Кеш-
память
(Cache)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Frontend
(Fetch, Decode)
ILP
TLP/PLP
Многоядерные процессоры с SMT
8
Состояние ядра
(Architectural State)
Кеш-
память
(Cache)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Frontend
(Fetch, Decode)
ILP
Состояние ядра
(Architectural State)
Кеш-
память
(Cache)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Frontend
(Fetch, Decode)
ILP
Thread 0 Thread 1
В системе 4 логических процессора
Потоки 0 и 1 выполняются на ресурсах одного ядра – привязаны
к логическим процессорам SMT (например, Intel Hyper-Threading)
В этом случае оба потока разделяют ресурсы одного суперскалярного
конвейера ядра – конкурируют за доступ к нему (concurrency)
Задействован только параллелизм уровня инструкций (ILP),
второе ядро простаивает
Instruction Level Parallelism only!
Concurrency
Многоядерные процессоры с SMT
9
Состояние ядра
(Architectural State)
Кеш-
память
(Cache)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Frontend
(Fetch, Decode)
ILP
Состояние ядра
(Architectural State)
Кеш-
память
(Cache)
Состояние ядра
(Architectural State)
Вычислительное ядро
(Execution Engine)
Frontend
(Fetch, Decode)
ILP
Thread 0 Thread 1
В системе 4 логических процессора
Потоки 0 и 1 выполняются на ресурсах разных ядер – привязаны
к логическим процессорам SMT ядра 0 и 1
В этом случае оба потока выполняются на суперскалярных конвейерах
разных ядер
Задействован параллелизм уровня потоков (TLP) и инструкций (ILP)
Thread Level Parallelism +
Instruction Level Parallelism
NUMA – Non-Uniform Memory Architecture
1010
У каждого многоядерного процессора имеется локальная память
Доступ к удаленной памяти занимает больше времени
(~ на 30%, HyperTransport)
SUMO – Sufficiently Uniform Memory Organization
AMD Hyper-Transport
NUMA - Non-Uniform Memory Architecture
1111
Intel Quick Path Interconnect (QPI)
NUMA - Non-Uniform Memory Architecture
1212
Узел на базе Intel Nehalem
2 процессора Intel Xeon 5600 (Westmere) 6-core, 2 IOH
NUMA - Non-Uniform Memory Architecture
1313
Как операционной системе выделять память для
процессов – с локального узла? с удаленного?
чередовать локальный узел и удаленный?
NUMA - Non-Uniform Memory Architecture
1414
Режим управления памятью NUMA-машины можно,
как правило, задать в настройках BIOS
Распространенные режимы (Memory modes):
NUMA Mode – у каждого узла имеется локальная
память, операционная система учитывает топологию
при выделении памяти
Node Interleave (чередование памяти между узлами) –
пространство адресов разбивается на регионы
и циклически заполняется со всех узлов (round robin),
операционная систем “думает”, что доступ к памяти
“однороден”
NUMA – Non-Uniform Memory Architecture
1515
Memory latency and bandwidth accessing local,
remote memory for a PowerEdge R610 server
(Dual Intel Xeon X5550 Nehalem, 6 x 4GB 1333 MHz RDIMMS)
http://i.dell.com/sites/content/business/solutions/whitepapers/ja/Documents/HPC_Dell_11g_BIOS_Options_jp.pdf
Мобильные телефоны (Mobile phones)
1616
Samsung Galaxy S4 (GT-I9505)
Quad-core Snapdragon 600
(1.9 GHz with LTE, ARMv7, CPU Krai 300)
Pipeline: 11 stage integer pipeline
(3-way decode, 4-way out-of-order
speculative issue superscalar)
SIMD: 128-bit wide NEON
L0 cache: 4 KB + 4 KB direct mapped
L1 cache: 16 KB + 16 KB 4-way set associative
L2 cache: 2 MB 8-way set associative
Technology process: 28 nm
Мобильные телефоны (Mobile phones)
1717
Apple iPhone 5S
Dual-core Apple A7 (CPU + GPU)
(CPU 1.3 GHz, 64-bit ARMv8)
SIMD: 128-bit wide NEON
L1 cache:
per core 64 KB L1i, 64 KB L1d
L2 cache: shared 1 MB
Technology process: 28 nm (manufactured by Samsung)
64 cores: Intel P54C (Pentium)
Pipeline: in-order, 4-way SMT, 512-bit SIMD
Кольцевая шина (1024 бит, ring bus)
для связи ядер и контроллера памяти
Память GDDR5
Устанавливается в PCI Express слот
SMP-система
(256 логических
процессоров)
Intel Xeon Phi Coprocessor (Intel MIC)
1818
Intel Xeon Phi Coprocessor (Intel MIC)
1919
http://www.anandtech.com/show/6451/the-xeon-phi-at-work-at-tacc
GPU – Graphics Processing Unit
2020
NVidia Kepler
AMD FirePro
Специализированные
мультипроцессоры (SMP)
Каждый процессор
многоядерный
Многоядерные процессоры (Multi-core processors)
2121
Sony Playstation 3
IBM Cell (2-way SMT
PowerPC core + 6 SPE)
Microsoft XBox 360
IBM Xenon
(3 cores with 2-way SMT)
Tilera TILEPro64
(64 cores, VLIW, mesh)
Cisco Routers
Multi-core MIPS processors
Многоядерные процессоры (Multi-core processors)
22
Sony Playstation 3
IBM Cell (2-way SMT
PowerPC core + 6 SPE)
Microsoft XBox 360
IBM Xenon
(3 cores with 2-way SMT)
Tilera TILEPro64
(64 cores, VLIW, mesh)
Cisco Routers
Multi-core MIPS processors
Что со всем этим делать?
Как (на чем) разрабатывать программы для такого
количества многоядерных архитектур?
Как быть с переносимостью программ?
Как быть с переносимостью производительности
программ?
Все ли алгоритмы эффективно распараллеливаются?
…
22
Многоядерные процессоры (Multi-core processors)
2323
“Concurrency is the next major revolution
in how we write software”
-- Herb Sutter*
[*] Herb Sutter. The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in
Software // http://www.gotw.ca/publications/concurrency-ddj.htm
Системы с распределенной памятью
2424
CPU0
Коммуникационная сеть (Interconnect, Communication network)
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
Compute node 0
CPU0
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
Compute node 1
Вычислительная система с распределенной памятью
(Distributed memory computer system) – совокупность вычислительных узлов,
взаимодействие между которыми осуществляется через коммуникационную
сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …)
Каждый узел имеет множество процессоров/ядер, взаимодействующих через
разделяемую память (Shared memory)
Процессоры могут быть многоядерными,
ядра могут поддерживать одновременную
многопоточность (SMT)
http://www.top500.org
http://www.green500.org
http://www.graph500.org
Системы с распределенной памятью
2525
CPU0
Коммуникационная сеть (Interconnect, Communication network)
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
Compute node 0
CPU0
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
Compute node 1
Вычислительная система с распределенной памятью
(Distributed memory computer system) – совокупность вычислительных узлов,
взаимодействие между которыми осуществляется через коммуникационную
сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …)
Каждый узел имеет множество процессоров/ядер, взаимодействующих через
разделяемую память (Shared memory)
Процессоры могут быть многоядерными,
ядра могут поддерживать одновременную
многопоточность (SMT)
ILP ILP ILP ILP
TLP/PLP
ILP ILP ILP ILP
TLP/PLP
TLP/PLP (Message Passing)
http://www.top500.org
http://www.green500.org
http://www.graph500.org
CPU Topology Intel64
2626
На процессорах Intel64 инструкция CPUID позволяет получить
информацию о привязке логических процессоров операционной
системы к аппаратным потокам (SMT), ядрам (cores)
и чипам (chips, packages)
Каждый логический процессор имеет уникальный APIC ID
(доступ к его полям осуществляется через CPUID)
Intel 64 Architecture Processor Topology Enumeration //
http://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration
OSDev Detecting CPU // http://wiki.osdev.org/Detecting_CPU_Topology_(80x86)
https://www.kernel.org/doc/Documentation/cputopology.txt
CPU Topology GNU/Linux (/sys)
2727
$ ls /sys/devices/system/cpu/cpu0/topology/
total 0
drwxr-xr-x. 2 root root 0 Sep 29 08:05 .
drwxr-xr-x. 8 root root 0 Sep 29 08:05 ..
-r--r--r--. 1 root root 4096 Sep 29 08:05 core_id
-r--r--r--. 1 root root 4096 Sep 29 08:05 core_siblings
-r--r--r--. 1 root root 4096 Sep 29 15:56 core_siblings_list
-r--r--r--. 1 root root 4096 Sep 29 08:05 physical_package_id
-r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings
-r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings_list
physical_package_id – номер физического процессора (сокета)
core_id – номер ядра физического процессора cpuX
core_siblings – битовая маска ядер, размещенных на одном физическом
процессоре
core_siblings_list – список номеров ядер, размещенных на одном физическом
процессоре
thread_siblings – битовая маска аппаратных потоков (SMT, Hype-Threading),
принадлежащих одному ядру
thread_siblings_list – список номеров аппаратных потоков (SMT, Hype-Threading),
принадлежащих одному ядру
Intel Core i5-2520M
(2 cores,
Hyper-Threading on)
CPU Topology GNU/Linux (/sys)
2828
$ ls /sys/devices/system/cpu/cpu0/topology/
total 0
drwxr-xr-x. 2 root root 0 Sep 29 08:05 .
drwxr-xr-x. 8 root root 0 Sep 29 08:05 ..
-r--r--r--. 1 root root 4096 Sep 29 08:05 core_id
-r--r--r--. 1 root root 4096 Sep 29 08:05 core_siblings
-r--r--r--. 1 root root 4096 Sep 29 15:56 core_siblings_list
-r--r--r--. 1 root root 4096 Sep 29 08:05 physical_package_id
-r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings
-r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings_list
Logical CPU0
physical_package_id = 0
core_id = 0
core_siblings = 00000000,00000000,00000000,0000000f
core_siblings_list = 0-3
thread_siblings = 00000000,00000000,00000000,00000003
thread_siblings_list = 0-1
Intel Core i5-2520M
(2 cores,
Hyper-Threading on)
Core 0
Architectural State 1
(H-T/SMT core)
Architectural State 0
(H-T/SMT core)
Core 1
Architectural State 1
(H-T/SMT core)
Architectural State 0
(H-T/SMT core)
Intel Core i5-2520M: package 0
CPU Topology GNU/Linux (/sys)
2929
$ ls /sys/devices/system/cpu/cpu3/topology/
total 0
drwxr-xr-x. 2 root root 0 Sep 29 08:05 .
drwxr-xr-x. 8 root root 0 Sep 29 08:05 ..
-r--r--r--. 1 root root 4096 Sep 29 08:05 core_id
-r--r--r--. 1 root root 4096 Sep 29 08:05 core_siblings
-r--r--r--. 1 root root 4096 Sep 29 15:56 core_siblings_list
-r--r--r--. 1 root root 4096 Sep 29 08:05 physical_package_id
-r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings
-r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings_list
Logical CPU3
physical_package_id = 0
core_id = 1
core_siblings = 00000000,00000000,00000000,0000000f
core_siblings_list = 0-3
thread_siblings = 00000000,00000000,00000000,0000000c
thread_siblings_list = 2-3
Intel Core i5-2520M
(2 cores,
Hyper-Threading on)
Core 0
Architectural State 1
(H-T/SMT core)
Core 1
Architectural State 1
(H-T/SMT core)
Architectural State 0
(H-T/SMT core)
Intel Core i5-2520M: package 0
Architectural State 0
(H-T/SMT core)
CPU Topology GNU/Linux (/proc)
3030
$ cat /proc/cpuinfo
processor : 0
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
processor : 1
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 1
initial apicid : 1
processor : 2
physical id : 0
siblings : 4
core id : 1
cpu cores : 2
apicid : 2
initial apicid : 2
Intel Core i5-2520M
(2 cores,
Hyper-Threading on)
CPU Topology GNU/Linux (dmidecode)
3131
# dmidecode -t processor
SMBIOS 2.6 present.
Handle 0x0001, DMI type 4, 42 bytes
Processor Information
Socket Designation: CPU
Family: Core i5
Manufacturer: Intel(R) Corporation
ID: A7 06 02 00 FF FB EB BF
Signature: Type 0, Family 6, Model 42, Stepping 7
Flags: ...
Version: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
External Clock: 100 MHz
Max Speed: 2500 MHz
Current Speed: 2500 MHz
L1 Cache Handle: 0x0002
L2 Cache Handle: 0x0003
L3 Cache Handle: 0x0004
Asset Tag: None
Part Number: None
Core Count: 2
Core Enabled: 2
Thread Count: 4
Characteristics: 64-bit capable
CPU Topology GNU/Linux (turbostat)
3232
$ ~/linux-3.11.2/tools/power/x86/turbostat
cor CPU %c0 GHz TSC SMI %c1 %c3 %c6 %c7 CTMP PTMP %pc2 %pc3 %pc6 %pc7 Pkg_W Cor_W GFX_W
2.37 2.99 2.49 0 97.63 0.00 0.00 0.00 66 68 0.00 0.00 0.00 0.00 13.90 10.65 0.19
0 0 2.59 2.99 2.49 0 97.41 0.00 0.00 0.00 66 68 0.00 0.00 0.00 0.00 13.90 10.65 0.19
0 1 1.14 2.99 2.49 0 98.86
1 2 5.07 2.99 2.49 0 94.93 0.00 0.00 0.00 63
1 3 0.69 2.99 2.49 0 99.31
turbostat – утилита, входящая в состав ядра Linux,
для отображения топологии процессоров, их текущей частоты
и информации о энергопотреблении (power-state)
turbostat использует инструкцию CPUID
Source code: linux/tools/power/x86/turbostat/turbostat.c
Intel Core i5-2520M
(2 cores,
Hyper-Threading on)
CPU Topology GNU/Linux (hwloc)
3333
$ lstopo ./topo.png
hwloc – пакет, собирающий информацию о топологии процессоров и
кеш-памяти машины
lstopo – формирует файл (png, pdf, xml) с топологией машины
lstopo-no-graphics – выводит топологию машины в консоль
http://www.open-mpi.org/projects/hwloc/
CPU Topology GNU/Linux (hwloc)
3434
$ lstopo-no-graphics
Machine (7873MB)
Socket L#0 + L3 L#0 (3072KB)
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#1)
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
PU L#2 (P#2)
PU L#3 (P#3)
HostBridge L#0
PCI 8086:0126
GPU L#0 "card0"
GPU L#1 "controlD64"
PCI 8086:1502
Net L#2 "em1"
PCIBridge
PCI 8086:0084
Net L#3 "wlp3s0"
PCI 8086:1c03
Block L#4 "sda"
Intel Core i5-2520M
(2 cores,
Hyper-Threading on)
http://www.open-mpi.org/projects/hwloc/
CPU Topology Microsoft Windows
3535
Пакет hwloc (Windows build)
Функции для получения информации о топологии
машины (MSDN)
o GetNumaHighestNodeNumber
o GetProcessAffinityMask
o GetNumaProcessorNode
o GetNumaNodeProcessorMask
CPUID
Intel 64 Architecture Processor Topology Enumeration //
http://software.intel.com/en-us/articles/intel-64-architecture-processor-
topology-enumeration
Processor affinity (CPU pinning)
3636
Process affinity (CPU pinning) – это принудительная привязка
процесса/потока к логическому процессору (планировщик
операционной системы не будет переносить процесс/поток
на другой процессор)
Причины:
нежелательная миграция процесса/потока на другой
процессор может привести к неэффективному
использованию кеш-памяти
выделение памяти с заданного NUMA-узла
(например, только с локального – ближайшего)
избежание назначения двух потоков на два аппаратных
SMT-потока (Hyper-Threading) одного физического ядра
(для избежание конкуренции за ресурсы конвейера ядра)
GNU/Linux CPU affinity
3737
taskset – позволяет привязать процесс (новый или
запущенный) к заданным логическим процессорам
3737Core 0
Architectural State 1
(H-T/SMT core)
Core 1
Architectural State 1
(H-T/SMT core)
Architectural State 0
(H-T/SMT core)
dgemm
CPU0 CPU1 CPU2 CPU3
$ taskset –c 2 ./dgemm
Architectural State 0
(H-T/SMT core)
$ taskset –c 0,1,2 ./dgemm # К любому из 3-х CPU
$ taskset –p 1553 # Информация о привязке процесса 1553
pid 1553's current affinity mask: f
GNU/Linux CPU affinity
3838
3838Core 0
Architectural State 1
(H-T/SMT core)
Core 1
Architectural State 1
(H-T/SMT core)
Architectural State 0
(H-T/SMT core)
dgemm
CPU0 CPU1 CPU2 CPU3
$ taskset -c 0 ./dgemm & # Launch 2 process in parallel
$ taskset -c 1 ./dgemm
Elapsed time: 3.503317 sec.
Elapsed time: 3.706128 sec.
Architectural State 0
(H-T/SMT core)
dgemm
Intel Core i5-2520M
GNU/Linux CPU affinity
3939
3939Core 0
Architectural State 1
(H-T/SMT core)
Core 1
Architectural State 1
(H-T/SMT core)
Architectural State 0
(H-T/SMT core)
dgemm
CPU0 CPU1 CPU2 CPU3
$ taskset -c 0 ./dgemm & # Launch 2 process in parallel
$ taskset -c 2 ./dgemm
Elapsed time: 2.310566 sec.
Elapsed time: 2.364204 sec.
Architectural State 0
(H-T/SMT core)
dgemm
Speedup 1.57
$ ./dgemm & # Default pinning (OS scheduler)
$ ./dgemm
Elapsed time: 2.171322 sec.
Elapsed time: 2.168358 sec.
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread,
size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread,
size_t cpusetsize, cpu_set_t *cpuset);
GNU/Linux CPU affinity
4040
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
int sched_getcpu(void);
int sched_setscheduler(pid_t pid, int policy,
const struct sched_param *param);
GNU/Linux NUMA policy library
4141
Linux NUMA policy – набор системных вызовов,
библиотек и утилит для управления памятью и процессами
на NUMA-системах
Системные вызовы:
get_mempolicy(), set_mempolicy(), mbind(), migrate_pages(),
move_pages(), …
Библиотека libnuma
Утилиты: numactl, numastat
NUMA-узлы (nodes): /sys/devices/system/node/nodeX
GNU/Linux NUMA policy library
4242
$ numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3
node 0 size: 7873 MB
node 0 free: 195 MB
node distances:
node 0
0: 10
$ numactl --show # NUMA policy of the current process
policy: default
preferred node: current
physcpubind: 0 1 2 3
cpubind: 0
nodebind: 0
membind: 0
Intel Core i5-2520M
GNU/Linux NUMA policy library
4343
Привязать процесс (и его дочерние процессы) к процессорам
указанных NUMA-узлов, память выделять только с указанных узлов
$ numactl --cpunodebind=0 --membind=0 ./dgemm
Привязать процесс (и его дочерние процессы) к логическим
процессорам согласно нумерации поля “processor” файла
/proc/cpuinfo
$ numactl --physcpubind=1 ./dgemm
Опции numactl:
o --localalloc – выделять память только с локального
NUMA-узла
o --preferred=node – выделять память с узла node,
если невозможно, выделить с других узлов
o --interleave=nodes – выделяет память с указанных NUMA-узлов
в режиме чередования страниц (interleave)
GNU/Linux libnuma API
4444
#include <numa.h>
/* cc ... –lnuma */
int numa_available(void);
void numa_bind(struct bitmask *nodemask);
int numa_run_on_node_mask(struct bitmask *nodemask);
int numa_sched_setaffinity(pid_t pid, struct bitmask *mask);
void numa_set_preferred(int node);
void numa_set_interleave_mask(struct bitmask *nodemask);
void numa_set_localalloc(void);
void numa_set_membind(struct bitmask *nodemask);
/* ... */
A NUMAAPI for LINUX //
http://developer.amd.com/wordpress/media/2012/10/LibNUMA-WP-fv1.pdf
Microsoft Windows CPU Affinity
4545
Windows Task Manager -> Processes -> Set Affinity…
Microsoft Windows 7, 8, Vista
C:> start /affinity 3 dgemm.exe
// C++
BOOL WINAPI SetProcessAffinityMask(_In_ HANDLE hProcess,
_In_ DWORD_PTR dwProcessAffinityMask );
DWORD_PTR WINAPI SetThreadAffinityMask(_In_ HANDLE hThread,
_In_ DWORD_PTR dwThreadAffinityMask );
// C#
public static extern bool
SetProcessAffinityMask(SafeProcessHandle handle, IntPtr mask);
public static extern IntPtr
SetThreadAffinityMask(SafeThreadHandle handle, HandleRef mask);
Microsoft Windows CPU Affinity
4646
// Windows NUMA API
BOOL WINAPI GetNumaProcessorNode(_In_ UCHAR Processor,
_Out_ PUCHAR NodeNumber);
BOOL WINAPI GetNumaNodeProcessorMask(_In_ UCHAR Node,
_Out_ PULONGLONG ProcessorMask);
BOOL WINAPI GetNumaAvailableMemoryNode(_In_ UCHAR Node,
_Out_ PULONGLONG AvailableBytes);
LPVOID WINAPI VirtualAllocExNuma(_In_ HANDLE hProcess,
_In_opt_ LPVOID lpAddress, _In_ SIZE_T dwSize,
_In_ DWORD flAllocationType,
_In_ DWORD flProtect, _In_ DWORD nndPreferred);
/* ... */
MSDN NUMA Support //
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).aspx
Программный инструментарий
4747Hardware (Multi-core processors, SMP/NUMA)
Kernel
thread
Process/thread scheduler
Системные вызовы (System calls)
GNU/Linux Pthreads Apple OS X Cocoa, Pthreads
Уровень ядра
(Kernel space)
Операционная система (Operating System)
GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, …
Kernel
thread
Kernel
thread
…
Уровень
пользователя
(User space)
Системные библиотеки (System libraries)
Thread Thread Thread Thread…
Win32 API/.NET Threads
Thread Thread Thread Thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Intel Threading Building Blocks (TBB)
Microsoft Concurrency Runtime
Apple Grand Central Dispatch
Boost Threads
Qthread, MassiveThreads
Прикладные библиотеки Языки программирования
OpenMP
(C/C++/Fortran)
Intel Cilk Plus
С++11 Threads
C11 Threads
C# Threads
Java Threads
Erlang Threads
Haskell Threads
Программный инструментарий
4848Hardware (Multi-core processors, SMP/NUMA)
Kernel
thread
Process/thread scheduler
Системные вызовы (System calls)
GNU/Linux Pthreads Apple OS X Cocoa, Pthreads
Уровень ядра
(Kernel space)
Операционная система (Operating System)
GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, …
Kernel
thread
Kernel
thread
…
Уровень
пользователя
(User space)
Системные библиотеки (System libraries)
Thread Thread Thread Thread…
Win32 API/.NET Threads
Thread Thread Thread Thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Intel Threading Building Blocks (TBB)
Microsoft Concurrency Runtime
Apple Grand Central Dispatch
Boost Threads
Qthread, MassiveThreads
Прикладные библиотеки Языки программирования
OpenMP
(C/C++/Fortran)
Intel Cilk Plus
С++11 Threads
C11 Threads
C# Threads
Java Threads
Erlang ThreadsОперационная система обеспечивает поддержку процессов и потоков уровня
ядра (kernel threads)
Планировщик реализует алгоритм распределения процессорного времени
между потоками/процессами
Пользователь создает/уничтожает потоки/процессы через интерфейс
системных вызовов (system calls)
Программный инструментарий
4949Hardware (Multi-core processors, SMP/NUMA)
Kernel
thread
Process/thread scheduler
Системные вызовы (System calls)
GNU/Linux Pthreads Apple OS X Cocoa, Pthreads
Уровень ядра
(Kernel space)
Операционная система (Operating System)
GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, …
Kernel
thread
Kernel
thread
…
Уровень
пользователя
(User space)
Системные библиотеки (System libraries)
Thread Thread Thread Thread…
Win32 API/.NET Threads
Thread Thread Thread Thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Intel Threading Building Blocks (TBB)
Microsoft Concurrency Runtime
Apple Grand Central Dispatch
Boost Threads
Qthread, MassiveThreads
Прикладные библиотеки Языки программирования
OpenMP
(C/C++/Fortran)
Intel Cilk Plus
С++11 Threads
C11 Threads
C# Threads
Java Threads
Erlang Threads
Haskell Threads
Системные библиотеки (Pthreads, .NET Threads, Apple Cocoa) используют
системные вызовы и реализуют более высокоуровневое API для работы
с потоками
В системных библиотеках принимается решение как отображать
user-space-потоки в kernel-space-потоки: one-to-one mapping (GNU/Linux, Windows),
one-to-many, many-to-many, many-to-one
Программный инструментарий
50Hardware (Multi-core processors, SMP/NUMA)
Kernel
thread
Process/thread scheduler
Системные вызовы (System calls)
GNU/Linux Pthreads Apple OS X Cocoa, Pthreads
Уровень ядра
(Kernel space)
Операционная система (Operating System)
GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, …
Kernel
thread
Kernel
thread
…
Уровень
пользователя
(User space)
Системные библиотеки (System libraries)
Thread Thread Thread Thread…
Win32 API/.NET Threads
Thread Thread Thread Thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Kernel
thread
Intel Threading Building Blocks (TBB)
Microsoft Concurrency Runtime
Apple Grand Central Dispatch
Boost Threads
Qthread, MassiveThreads
Прикладные библиотеки Языки программирования
OpenMP
(C/C++/Fortran)
Intel Cilk Plus
С++11 Threads
C11 Threads
C# Threads
Java Threads
Erlang Threads
Haskell Threads
Высокоуровневые языки, их расширения и библиотеки могут
реализовывать на базе потоков системных библиотек (POSIX Pthreads,
Windows Threads) легковесные потоки – задачи (tasks, lightweight threads)
Причины: сокращение издержек, связанных с созданием потоков,
поддержанием их функционирования и переключением контекстов
Примеры: задачи в OpenMP (#pragma omp task),
Intel TBB (task_group::run), Intel Cilk Plus (cilk_spawn),
Примеры: библиотеки легковесных user-level-потоков
Qthread, MassiveThreads
Виртуальные машины и интерпретаторы некоторых языков реализуют
user-level-потоки (green threads): Haskell, Go, Lua, Ruby < v1.9
User-level
threads
(tasks)
System
library
threads
(pthreads,
Win32 threads)
Kernel
threads
50
Процессы и потоки
5151
Инструкции
(Instructions)
Инициализированные данные
(Initialized data)
ELF/PE File
Исполняемый файл (Image) на диске – программа (Application, Program)
Запущенная программа – процесс (Process) с одним потоком выполнения
Memory
Инструкции
(Instructions)
Инициализированные данные
(Initialized data)
Неинициализированные данные
(Uninitialized data)
Куча (Heap – Virtual Memory)
Данные библиотек
(Library data)
Инструкции библиотек
(Library instructions)
Stack
Registers
Поток 0
(Thread 0)
Многопоточный процесс (Multithreaded)
5252
Memory
Инструкции
(Instructions)
Инициализированные данные
(Initialized data)
Неинициализированные данные
(Uninitialized data)
Куча (Heap – Virtual Memory)
Данные библиотек
(Library data)
Инструкции библиотек
(Library instructions)
Stack
Registers
Поток 0
(Thread 0)
Stack
Registers
Поток 1
(Thread 1)
Stack
Registers
Поток 2
(Thread 2)
Stack
Registers
Поток 3
(Thread 3)
Stack
Registers
Поток 4
(Thread 4)
Stack
Registers
Поток 5
(Thread 5)
Каждый поток имеет свой стек и память для хранения значения
архитектурных регистров при переключении контекстов (context switching)
Куча процесса, инструкции, статические данные (инициализированные)
общие для всех потоков
Main memory
Multiprocess vs. Multithreaded program
5353
Однопоточный процесс обращается к памяти
Cache
Thread 0
Heap
Virtual addr. v[0] TLB
v[0], v[1], v[2]
// Mem -> Reg
movl v[0], %eax
Physical Addr. v[0]
Physical addr. v[0]
Главный поток процесса обращается
к элементу массива v[0] в его памяти (куче)
Виртуальный адрес v[0] преобразуется
в физический: находится запись
в кеш-памяти TLB или при помощи ядра
По физическому адресу данный загружаются
из кеш-памяти или оперативной памяти
в регистр
Process
Main memory
Multiprocess vs. Multithreaded program
5454
Многопоточная программа (Multithreaded application)
Cache
Thread 0
Heap
Virtual addr. v[0] TLB
v[0], v[1], v[2]
Physical Addr. v[0]
V[0] Proc1
Physical addr. v[0]
Thread 1
Process Запустили процесс с двумя потоками,
оба потока читают v[0]
Виртуальные адреса v[0] в обеих потоках
совпадают – потоки разделяют общую память
Физические адреса v[0] в каждом потоке также
совпадают, страницы памяти выделяются
процессу и совместно используются потоками
Process 1
Main memory
Multiprocess vs. Multithreaded program
5555
Многопроцессная программа (Multi-process application)
Cache
Thread 0
Heap
Virtual addr. v[0] TLB
v[0], v[1], v[2]
Physical Addr. v[0]
V[0] Proc1
Physical addr. v[0]
Запустили 2 процесса одной и той же
программы, оба процесса читают v[0]
Виртуальный адрес v[0]
в обеих процессах совпадает
Физический адрес v[0] в каждом процессе
свой, т.к. процессам выделены разные
страницы памяти
Данные каждого процесса будут занимать
местов в TLB, кеш-памяти
Thread 0
Heap
v[0], v[1], v[2]
Process 1 Process 2
V[0] Proc2
Main memory
Multiprocess vs. Multithreaded program
5656
Многопроцессная программа (Multi-process application)
Cache
Thread 0
Heap
Virtual addr. v[0] TLB
v[0], v[1], v[2]
Physical Addr. v[0]
V[0] Proc1
Physical addr. v[0]
Выводы
Многопроцессная версия программы будет
оказывать большую нагрузку
на TLB и кеш-память
В многопоточной программе отказ одного
потока может привезти к отказу всего
приложения
Архитектуру приложения следует
выбирать под решаемую задачу
Thread 0
Heap
v[0], v[1], v[2]
Process 1 Process 2
V[0] Proc2
Memory consistency
5757
В ходе выполнения инструкций на суперскалярном процессоре операции
чтения и записи памяти могут быть выполнены в порядке отличном
от исходного (out of order execution)
Процессор реализует одну из моделей согласованности памяти
(Memory consistency):
Sequential consistency – операции чтения и записи
не переупорядочиваются (strict memory ordering)
Relaxed consistency – допустимы некоторые виды переупорядочивания
o Loads can be reordered after loads
o Loads can be reordered after stores
o Stores can be reordered after stores
o Stores can be reordered after loads
Weak consistency (strict memory ordering) – допустимо любое
переупорядочивание операций чтения и записи; для предотвращения
переупорядочивания в программе вставляются инструкция
“барьер памяти” (memory barrier, membar, memory fence)
Memory ordering
58
Type Alpha ARMv7 POWER
SPARC
PSO
x86 x86 oostore AMD64 IA-64 zSeries
Loads reordered
after loads Y Y Y Y Y
Loads reordered
after stores Y Y Y Y Y
Stores reordered
after stores Y Y Y Y Y Y
Stores reordered
after loads Y Y Y Y Y Y Y Y Y
Atomic reordered
with loads Y Y Y Y
Atomic reordered
with stores Y Y Y Y Y
Dependent loads
reordered Y
Incoherent
Instruction cache
pipeline
Y Y Y Y Y Y Y Y
58
Memory ordering Intel64 (Core 2 Duo)
5959
Chapter 8.2 [1]: In a single-processor system for memory regions defined as write-back
cacheable, the memory-ordering model respects the following principles:
Reads are not reordered with other reads.
Writes are not reordered with older reads.
Writes to memory are not reordered with other writes, with the following exceptions: writes
executed with the CLFLUSH instruction; streaming stores (writes) executed with the non
temporal move instructions (MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, and
MOVNTPD); and string operations (see Section 8.2.4.1).
Reads may be reordered with older writes to different locations but not with older writes to
the same location.
Reads or writes cannot be reordered with I/O instructions, locked instructions, or serializing
instructions.
Reads cannot pass earlier LFENCE and MFENCE instructions.
Writes cannot pass earlier LFENCE, SFENCE, and MFENCE instructions.
LFENCE instructions cannot pass earlier reads.
SFENCE instructions cannot pass earlier writes.
MFENCE instructions cannot pass earlier reads or writes.
[1] Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, and 3C:
System Programming Guide // http://download.intel.com/products/processor/manual/325384.pdf
Weak memory ordering
6060
Имеется переменная count, доступ к которой защищён через lock
(критическая секция)
Увеличиваем count и освобождаем lock (lock = 0)
/* Считаем, что lock уже захвачен */
movl count, %eax
incl %eax
movl %eax, count
movl $0, lock
На суперскалярном процессоре со слабым упорядочиванием доступа к памяти
(weak ordering of memory) две последние инструкции могут быть
переставлены и выполнены в следующем порядке:
1. movl count, %eax
2. incl %eax
3. movl $0, lock
4. movl %eax, count
lock будет освобожден прежде чем в count будет записано новое значение,
другой поток может захватить lock и успеть загрузить старое значение count
Программист должен учитывать реализуемую процессором модель
упорядочивания доступа к памяти (memory ordering)
Weak memory ordering
6161
1. movl count, %eax
2. incl %eax
3. movl $0, lock
4. movl %eax, count
Решение – запретить процессору переставлять две последние
инструкции movl
/* Считаем, что lock уже захвачен */
movl count, %eax
incl %eax
movl %eax, count
mfence /* ждем пока все операции load/store завершатся */
movl $0, lock
mfence – это инструкция “барьер памяти” (memory barrier)
гарантирует, что пока не завершатся предшествующие операции
load/store новые операции load/store не будут выполнены
mfence – performs a serializing operation on all load and store instructions
that were issued prior the MFENCE instruction [Intel docs]
/* x86, x86_64 */
void _mm_lfence(); /* lfence */
void _mm_sfence(); /* sfence */
void _mm_mfence(); /* mfence */
Memory barrier
6262
Compiler memory barrier – предотвращает перестановку инструкций
компилятором (в ходе оптимизации)
/* GNU inline assembler */
asm volatile("" ::: "memory");
/* Intel C++ intrinsic */
__memory_barrier();
/* Microsoft Visual C++ */
_ReadWriteBarrier()
Hardware memory barrier – предотвращает перестановку инструкций
процессором
GCC: Built-in functions for atomic memory access //
http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Atomic-Builtins.html
LLVM Atomic Instructions and Concurrency Guide // http://llvm.org/docs/Atomics.html
Linux kernel memory barriers // https://www.kernel.org/doc/Documentation/memory-barriers.txt
Модели параллельного программирования
6363
Модели параллельного программирования (Parallel programming models)
можно классифицировать по двум признакам:
1) по способу взаимодействия процессов/потоков (process interaction)
2) по методу декомпозиции задачи, способу выражения параллелизма
(problem decomposition)
Parallel programming models
Process interaction Problem decomposition
Shared memory
(PRAM)
Message passing
(BSP, LogP, LogGP) Implicit
parallelism
Task parallelism
Data parallelism
Модели параллельного программирования
6464
Problem decomposition
Task parallelism
Язык/библиотека поддерживает
конструкции для порождения
и управления задачами (потоками)
POSIX Pthreads
Windows Threads
OpenMP
Intel Cilk Plus
Intel TBB
Boost Threads
Microsoft Task Parallel Library, …
POSIX Pthreads:
Data parallelism
Язык/библиотека реализует параллельные
операции над данными (например,
суммирование элементов массива)
Intel Array Building Blocks
Intel Threading Building Blocks
Intel Cilk/C/C++ Array Notations
Microsoft Task Parallel Library
JVM Ateji PX, …
Intel Array Building Blocks:
// Create thread
pthread_create(&tid, 0, fun, 0);
// Sum arrays in parallel
dense<f32> A = B + C;
Fork-join parallelism
6565
Fork-join – это разновидность параллелизма задач, которая поддерживает две
операции для динамического порождения задачи и ожидания их завершения:
fork – динамически порождает новую задачу (поток), которая выполняется
параллельно с родительской задачей
join – дожидается завершения дочерней задачи, объединяет (join) потоки
управления родительской задачи и дочерней
Как правило, задачи реализуется на базе
легковесных потоков, которые динамически
распределяются runtime-системой языка/библиотеки
по пулу потоков операционной системы
Для динамическая балансировка загрузки потоков
используется алгоритмы типа work stealing
Fork-join используется для распараллеливания
рекурсивных алгоритмов типа “Divide & Conquer”
Реализации: OpenMP (tasks), Intel Cilk Plus,
Microsoft Task Parallel Library, …
int fib(int n) {
int x, y;
if (n < 2) return n;
x = cilk_spawn fib(n-1);
y = fib(n-2);
cilk_sync;
return x + y;
}
fib(n-2) fib(n-1)
cilk_sync
cilk_spawn
Конструкции многопоточного программирования
6666
Конструкции управления потоками
o порождение потоков (create, spawn, fork, run, …)
o ожидание завершения потоков (join, sync, wait, …)
o управление потоками (set_attr, …)
Конструкции синхронизации потоков (synchronization)
o Критические секции (critical sections)
o Семафоры (semaphores)
o Взаимные исключения (mutexes)
o Блокировки (locks, spin locks, read-write locks)
o Барьеры (barriers)
o Атомарные операции (atomics, lock-free code)
Конструкции для взаимодействия потоков (communications)
o Условные переменные (conditional variables)
o “Барьеры памяти” (memory barriers, memory fences)
o Доступ к локальной памяти потоков (thread local storage)
Ссылки
6767
Эхтер Ш., Робертс Дж. Многоядерное программирование. – СПб.: Питер,
2010. – 316 с.
Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного
программирования. – М.: Вильямс, 2003. – 512 с.
Darryl Gove. Multicore Application Programming: for Windows, Linux, and
Oracle Solaris. – Addison-Wesley, 2010. – 480 p.
Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming. –
Morgan Kaufmann, 2008. – 528 p.
Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing,
Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32
Programs. – Wiley-Interscience, 2005. – 480 p.
Anthony Williams. C++ Concurrency in Action: Practical Multithreading. –
Manning Publications, 2012. – 528 p.
Träff J.L. Introduction to Parallel Computing //
http://www.par.tuwien.ac.at/teach/WS12/ParComp.html

More Related Content

What's hot

компьютер 5
компьютер 5компьютер 5
компьютер 5vampir3424
 
Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...Mikhail Kurnosov
 
Процессор
ПроцессорПроцессор
ПроцессорTitenko1
 
Строение компьютера
Строение компьютераСтроение компьютера
Строение компьютераRonny_Rosenberg
 
Процессоры и составляющие системного блока
Процессоры и составляющие системного блокаПроцессоры и составляющие системного блока
Процессоры и составляющие системного блокаWewillneversleep
 
033
033033
033JIuc
 
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...Mikhail Kurnosov
 
Процессоры нетрадиционной архитектуры
Процессоры нетрадиционной архитектурыПроцессоры нетрадиционной архитектуры
Процессоры нетрадиционной архитектурыАнтон Широков
 
Магистрально модульный принцип построения пк
Магистрально модульный принцип построения пкМагистрально модульный принцип построения пк
Магистрально модульный принцип построения пкAndrey Dolinin
 
022
022022
022JIuc
 
40
4040
40JIuc
 
процессоры и куллеры
процессоры и куллерыпроцессоры и куллеры
процессоры и куллерыKozinskaIS
 
процессоры и кулеры
процессоры и кулерыпроцессоры и кулеры
процессоры и кулерыKozinskaIS
 
42
4242
42JIuc
 
Лекция №9 Организация ЭВМ и систем
Лекция №9 Организация ЭВМ и системЛекция №9 Организация ЭВМ и систем
Лекция №9 Организация ЭВМ и системpianist2317
 
Презентация на тему: Компьютер – универсальное устройство обработки информации
Презентация на тему: Компьютер – универсальное устройство обработки информацииПрезентация на тему: Компьютер – универсальное устройство обработки информации
Презентация на тему: Компьютер – универсальное устройство обработки информации2berkas
 

What's hot (20)

компьютер 5
компьютер 5компьютер 5
компьютер 5
 
Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1. Архитектурно-ориентированная оптимизация программного обеспечения (...
 
Процессор
ПроцессорПроцессор
Процессор
 
Строение компьютера
Строение компьютераСтроение компьютера
Строение компьютера
 
Процессоры и составляющие системного блока
Процессоры и составляющие системного блокаПроцессоры и составляющие системного блока
Процессоры и составляющие системного блока
 
033
033033
033
 
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
 
Процессоры нетрадиционной архитектуры
Процессоры нетрадиционной архитектурыПроцессоры нетрадиционной архитектуры
Процессоры нетрадиционной архитектуры
 
Лекция № 2 Организация ЭВМ и систем
Лекция № 2 Организация ЭВМ и системЛекция № 2 Организация ЭВМ и систем
Лекция № 2 Организация ЭВМ и систем
 
Ustroystvo kompyutera
Ustroystvo kompyuteraUstroystvo kompyutera
Ustroystvo kompyutera
 
Магистрально модульный принцип построения пк
Магистрально модульный принцип построения пкМагистрально модульный принцип построения пк
Магистрально модульный принцип построения пк
 
022
022022
022
 
40
4040
40
 
Память
ПамятьПамять
Память
 
процессоры и куллеры
процессоры и куллерыпроцессоры и куллеры
процессоры и куллеры
 
процессоры и кулеры
процессоры и кулерыпроцессоры и кулеры
процессоры и кулеры
 
42
4242
42
 
Лекция №9 Организация ЭВМ и систем
Лекция №9 Организация ЭВМ и системЛекция №9 Организация ЭВМ и систем
Лекция №9 Организация ЭВМ и систем
 
Презентация на тему: Компьютер – универсальное устройство обработки информации
Презентация на тему: Компьютер – универсальное устройство обработки информацииПрезентация на тему: Компьютер – универсальное устройство обработки информации
Презентация на тему: Компьютер – универсальное устройство обработки информации
 
[DD] 10. Memory
[DD] 10. Memory[DD] 10. Memory
[DD] 10. Memory
 

Viewers also liked

О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"Yandex
 
Альтернативные способы изучения программирования с нуля
Альтернативные способы изучения программирования с нуляАльтернативные способы изучения программирования с нуля
Альтернативные способы изучения программирования с нуляCOMAQA.BY
 
Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programmingcolriot
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиDotNetConf
 
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...Mikhail Kurnosov
 
О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"Yandex
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексYandex
 
Антон Нехаев - Многопоточное и распределенное программирование
Антон Нехаев - Многопоточное и распределенное программированиеАнтон Нехаев - Многопоточное и распределенное программирование
Антон Нехаев - Многопоточное и распределенное программированиеDataArt
 

Viewers also liked (8)

О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"
 
Альтернативные способы изучения программирования с нуля
Альтернативные способы изучения программирования с нуляАльтернативные способы изучения программирования с нуля
Альтернативные способы изучения программирования с нуля
 
Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programming
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметки
 
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
 
О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
Антон Нехаев - Многопоточное и распределенное программирование
Антон Нехаев - Многопоточное и распределенное программированиеАнтон Нехаев - Многопоточное и распределенное программирование
Антон Нехаев - Многопоточное и распределенное программирование
 

Similar to Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming: multi-core processors, CPU affinity, memory ordering)

Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Mikhail Kurnosov
 
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...VThn18
 
prezlec_Історія.ppt
prezlec_Історія.pptprezlec_Історія.ppt
prezlec_Історія.pptssusere2bc36
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
Обзор современных микроконтроллеров и их архитектур
Обзор современных микроконтроллеров и их архитектурОбзор современных микроконтроллеров и их архитектур
Обзор современных микроконтроллеров и их архитектурIoT Community
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSUlarhat
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
 
тема 2 2.техническое обеспечение компьютера
тема 2 2.техническое обеспечение компьютератема 2 2.техническое обеспечение компьютера
тема 2 2.техническое обеспечение компьютераmrprizrak
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессовstudent_SSGA
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Presentation Amd Cpu
Presentation Amd CpuPresentation Amd Cpu
Presentation Amd Cpuandrei145
 
Performance optimisations
Performance optimisationsPerformance optimisations
Performance optimisationsAntony Pavlenko
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Аппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютераАппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютераstudent_SSGA
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 
1. Sartakov. Virtualization. June 01, 2013
1. Sartakov. Virtualization. June 01, 20131. Sartakov. Virtualization. June 01, 2013
1. Sartakov. Virtualization. June 01, 2013ru-fedora-moscow-2013
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 

Similar to Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming: multi-core processors, CPU affinity, memory ordering) (20)

Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
 
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
 
prezlec_Історія.ppt
prezlec_Історія.pptprezlec_Історія.ppt
prezlec_Історія.ppt
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
Обзор современных микроконтроллеров и их архитектур
Обзор современных микроконтроллеров и их архитектурОбзор современных микроконтроллеров и их архитектур
Обзор современных микроконтроллеров и их архитектур
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSU
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
тема 2 2.техническое обеспечение компьютера
тема 2 2.техническое обеспечение компьютератема 2 2.техническое обеспечение компьютера
тема 2 2.техническое обеспечение компьютера
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессов
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
4
44
4
 
Presentation Amd Cpu
Presentation Amd CpuPresentation Amd Cpu
Presentation Amd Cpu
 
Performance optimisations
Performance optimisationsPerformance optimisations
Performance optimisations
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Аппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютераАппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютера
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
1. Sartakov. Virtualization. June 01, 2013
1. Sartakov. Virtualization. June 01, 20131. Sartakov. Virtualization. June 01, 2013
1. Sartakov. Virtualization. June 01, 2013
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 

More from Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 

Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming: multi-core processors, CPU affinity, memory ordering)

  • 1. Лекция 5: Многопоточное программирование Часть 1 (Multithreading programming) Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Уровень параллелизма Аппаратурная реализация Granularity Параллелизм уровня инструкций ILP – Instruction Level Parallelism Вычислительное ядро процессора (Processor execution core/engine) Мелкозернистый параллелизм (Fine-grained parallelism) Параллелизм уровня потоков TLP – Thread Level Parallelism Многоядерный процессор (Multi-core processor), многопроцессорная система с общей памятью (Shared memory system, SMP/ NUMA) Крупнозернистый параллелизм (Coarse-grained parallelism) Параллелизм уровня процессов PLP – Process Level Parallelism Вычислительная система с распределенной памятью (Distributed memory system) Уровни параллелизма 22
  • 3. Одноядерные процессоры (Single-core processors) 33 Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш-память (Cache) Frontend (Fetch, Decode) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш-память (Cache) Frontend (Fetch, Decode) Состояние ядра (Architectural State) Одноядерный процессор (Single-core processor) Superscalar pipeline Out-of-order execution SIMD instructions VLIW Одноядерный процессор с поддержкой одновременной многопоточности (Simultaneous multithreading , SMT) 2 потока разделяют суперскалярный конвейер ILP ILP Chip Chip
  • 4. Многопроцессорные системы (SMP, NUMA) 44 Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш- память (Cache) Frontend (Fetch, Decode) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш- память (Cache) Frontend (Fetch, Decode) Разделяемая память (Shared memory, RAM) ILP ILP TLP/PLP SMP/NUMA-системы Процессоры независимы – независимые чипы (chip), установлены в разные разъемы на системной плате и имеют общий доступ к оперативной памяти Операционная система предоставляет доступ к совокупности логических процессоров (logical processors) Chip Chip
  • 5. Многоядерные процессоры (Multi-core processors) 55 Процессорные ядра размещены на одном чипе (chip) Ядра процессора могу разделять некоторые ресурсы (например, кеш-память) Операционная система предоставляет доступ к совокупности логических процессоров (logical processors) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш- память (Cache) Frontend (Fetch, Decode) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш- память (Cache) Frontend (Fetch, Decode) ILP ILP TLP/PLP Chip
  • 6. Многоядерные процессоры (Multi-core processors) 66 Процессорные ядра размещены на одном чипе (chip) Ядра процессора могу разделять некоторые ресурсы (например, кеш-память) Операционная система предоставляет доступ к совокупности логических процессоров (logical processors) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш- память (Cache) Frontend (Fetch, Decode) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Кеш- память (Cache) Frontend (Fetch, Decode) ILP ILP Chip Разделяемая кеш-память (Shared cache) TLP/PLP
  • 7. Многоядерные процессоры с SMT 77 Многоядерный процессор может поддерживать одновременную многопоточность (Simultaneous multithreading – SMT, Intel Hyper-threading, Fujitsu Vertical Multithreading) Каждое ядро может выполнять несколько потоков на своем суперскалярном конвейере (2-way SMT, 4-way SMT, 8-way SMT, …) Операционная система представляет каждый SMT-поток как логический процессор Состояние ядра (Architectural State) Кеш- память (Cache) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Frontend (Fetch, Decode) ILP Состояние ядра (Architectural State) Кеш- память (Cache) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Frontend (Fetch, Decode) ILP TLP/PLP
  • 8. Многоядерные процессоры с SMT 8 Состояние ядра (Architectural State) Кеш- память (Cache) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Frontend (Fetch, Decode) ILP Состояние ядра (Architectural State) Кеш- память (Cache) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Frontend (Fetch, Decode) ILP Thread 0 Thread 1 В системе 4 логических процессора Потоки 0 и 1 выполняются на ресурсах одного ядра – привязаны к логическим процессорам SMT (например, Intel Hyper-Threading) В этом случае оба потока разделяют ресурсы одного суперскалярного конвейера ядра – конкурируют за доступ к нему (concurrency) Задействован только параллелизм уровня инструкций (ILP), второе ядро простаивает Instruction Level Parallelism only! Concurrency
  • 9. Многоядерные процессоры с SMT 9 Состояние ядра (Architectural State) Кеш- память (Cache) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Frontend (Fetch, Decode) ILP Состояние ядра (Architectural State) Кеш- память (Cache) Состояние ядра (Architectural State) Вычислительное ядро (Execution Engine) Frontend (Fetch, Decode) ILP Thread 0 Thread 1 В системе 4 логических процессора Потоки 0 и 1 выполняются на ресурсах разных ядер – привязаны к логическим процессорам SMT ядра 0 и 1 В этом случае оба потока выполняются на суперскалярных конвейерах разных ядер Задействован параллелизм уровня потоков (TLP) и инструкций (ILP) Thread Level Parallelism + Instruction Level Parallelism
  • 10. NUMA – Non-Uniform Memory Architecture 1010 У каждого многоядерного процессора имеется локальная память Доступ к удаленной памяти занимает больше времени (~ на 30%, HyperTransport) SUMO – Sufficiently Uniform Memory Organization AMD Hyper-Transport
  • 11. NUMA - Non-Uniform Memory Architecture 1111 Intel Quick Path Interconnect (QPI)
  • 12. NUMA - Non-Uniform Memory Architecture 1212 Узел на базе Intel Nehalem 2 процессора Intel Xeon 5600 (Westmere) 6-core, 2 IOH
  • 13. NUMA - Non-Uniform Memory Architecture 1313 Как операционной системе выделять память для процессов – с локального узла? с удаленного? чередовать локальный узел и удаленный?
  • 14. NUMA - Non-Uniform Memory Architecture 1414 Режим управления памятью NUMA-машины можно, как правило, задать в настройках BIOS Распространенные режимы (Memory modes): NUMA Mode – у каждого узла имеется локальная память, операционная система учитывает топологию при выделении памяти Node Interleave (чередование памяти между узлами) – пространство адресов разбивается на регионы и циклически заполняется со всех узлов (round robin), операционная систем “думает”, что доступ к памяти “однороден”
  • 15. NUMA – Non-Uniform Memory Architecture 1515 Memory latency and bandwidth accessing local, remote memory for a PowerEdge R610 server (Dual Intel Xeon X5550 Nehalem, 6 x 4GB 1333 MHz RDIMMS) http://i.dell.com/sites/content/business/solutions/whitepapers/ja/Documents/HPC_Dell_11g_BIOS_Options_jp.pdf
  • 16. Мобильные телефоны (Mobile phones) 1616 Samsung Galaxy S4 (GT-I9505) Quad-core Snapdragon 600 (1.9 GHz with LTE, ARMv7, CPU Krai 300) Pipeline: 11 stage integer pipeline (3-way decode, 4-way out-of-order speculative issue superscalar) SIMD: 128-bit wide NEON L0 cache: 4 KB + 4 KB direct mapped L1 cache: 16 KB + 16 KB 4-way set associative L2 cache: 2 MB 8-way set associative Technology process: 28 nm
  • 17. Мобильные телефоны (Mobile phones) 1717 Apple iPhone 5S Dual-core Apple A7 (CPU + GPU) (CPU 1.3 GHz, 64-bit ARMv8) SIMD: 128-bit wide NEON L1 cache: per core 64 KB L1i, 64 KB L1d L2 cache: shared 1 MB Technology process: 28 nm (manufactured by Samsung)
  • 18. 64 cores: Intel P54C (Pentium) Pipeline: in-order, 4-way SMT, 512-bit SIMD Кольцевая шина (1024 бит, ring bus) для связи ядер и контроллера памяти Память GDDR5 Устанавливается в PCI Express слот SMP-система (256 логических процессоров) Intel Xeon Phi Coprocessor (Intel MIC) 1818
  • 19. Intel Xeon Phi Coprocessor (Intel MIC) 1919 http://www.anandtech.com/show/6451/the-xeon-phi-at-work-at-tacc
  • 20. GPU – Graphics Processing Unit 2020 NVidia Kepler AMD FirePro Специализированные мультипроцессоры (SMP) Каждый процессор многоядерный
  • 21. Многоядерные процессоры (Multi-core processors) 2121 Sony Playstation 3 IBM Cell (2-way SMT PowerPC core + 6 SPE) Microsoft XBox 360 IBM Xenon (3 cores with 2-way SMT) Tilera TILEPro64 (64 cores, VLIW, mesh) Cisco Routers Multi-core MIPS processors
  • 22. Многоядерные процессоры (Multi-core processors) 22 Sony Playstation 3 IBM Cell (2-way SMT PowerPC core + 6 SPE) Microsoft XBox 360 IBM Xenon (3 cores with 2-way SMT) Tilera TILEPro64 (64 cores, VLIW, mesh) Cisco Routers Multi-core MIPS processors Что со всем этим делать? Как (на чем) разрабатывать программы для такого количества многоядерных архитектур? Как быть с переносимостью программ? Как быть с переносимостью производительности программ? Все ли алгоритмы эффективно распараллеливаются? … 22
  • 23. Многоядерные процессоры (Multi-core processors) 2323 “Concurrency is the next major revolution in how we write software” -- Herb Sutter* [*] Herb Sutter. The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software // http://www.gotw.ca/publications/concurrency-ddj.htm
  • 24. Системы с распределенной памятью 2424 CPU0 Коммуникационная сеть (Interconnect, Communication network) Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache Compute node 0 CPU0 Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache Compute node 1 Вычислительная система с распределенной памятью (Distributed memory computer system) – совокупность вычислительных узлов, взаимодействие между которыми осуществляется через коммуникационную сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …) Каждый узел имеет множество процессоров/ядер, взаимодействующих через разделяемую память (Shared memory) Процессоры могут быть многоядерными, ядра могут поддерживать одновременную многопоточность (SMT) http://www.top500.org http://www.green500.org http://www.graph500.org
  • 25. Системы с распределенной памятью 2525 CPU0 Коммуникационная сеть (Interconnect, Communication network) Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache Compute node 0 CPU0 Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache Compute node 1 Вычислительная система с распределенной памятью (Distributed memory computer system) – совокупность вычислительных узлов, взаимодействие между которыми осуществляется через коммуникационную сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …) Каждый узел имеет множество процессоров/ядер, взаимодействующих через разделяемую память (Shared memory) Процессоры могут быть многоядерными, ядра могут поддерживать одновременную многопоточность (SMT) ILP ILP ILP ILP TLP/PLP ILP ILP ILP ILP TLP/PLP TLP/PLP (Message Passing) http://www.top500.org http://www.green500.org http://www.graph500.org
  • 26. CPU Topology Intel64 2626 На процессорах Intel64 инструкция CPUID позволяет получить информацию о привязке логических процессоров операционной системы к аппаратным потокам (SMT), ядрам (cores) и чипам (chips, packages) Каждый логический процессор имеет уникальный APIC ID (доступ к его полям осуществляется через CPUID) Intel 64 Architecture Processor Topology Enumeration // http://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration OSDev Detecting CPU // http://wiki.osdev.org/Detecting_CPU_Topology_(80x86) https://www.kernel.org/doc/Documentation/cputopology.txt
  • 27. CPU Topology GNU/Linux (/sys) 2727 $ ls /sys/devices/system/cpu/cpu0/topology/ total 0 drwxr-xr-x. 2 root root 0 Sep 29 08:05 . drwxr-xr-x. 8 root root 0 Sep 29 08:05 .. -r--r--r--. 1 root root 4096 Sep 29 08:05 core_id -r--r--r--. 1 root root 4096 Sep 29 08:05 core_siblings -r--r--r--. 1 root root 4096 Sep 29 15:56 core_siblings_list -r--r--r--. 1 root root 4096 Sep 29 08:05 physical_package_id -r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings -r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings_list physical_package_id – номер физического процессора (сокета) core_id – номер ядра физического процессора cpuX core_siblings – битовая маска ядер, размещенных на одном физическом процессоре core_siblings_list – список номеров ядер, размещенных на одном физическом процессоре thread_siblings – битовая маска аппаратных потоков (SMT, Hype-Threading), принадлежащих одному ядру thread_siblings_list – список номеров аппаратных потоков (SMT, Hype-Threading), принадлежащих одному ядру Intel Core i5-2520M (2 cores, Hyper-Threading on)
  • 28. CPU Topology GNU/Linux (/sys) 2828 $ ls /sys/devices/system/cpu/cpu0/topology/ total 0 drwxr-xr-x. 2 root root 0 Sep 29 08:05 . drwxr-xr-x. 8 root root 0 Sep 29 08:05 .. -r--r--r--. 1 root root 4096 Sep 29 08:05 core_id -r--r--r--. 1 root root 4096 Sep 29 08:05 core_siblings -r--r--r--. 1 root root 4096 Sep 29 15:56 core_siblings_list -r--r--r--. 1 root root 4096 Sep 29 08:05 physical_package_id -r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings -r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings_list Logical CPU0 physical_package_id = 0 core_id = 0 core_siblings = 00000000,00000000,00000000,0000000f core_siblings_list = 0-3 thread_siblings = 00000000,00000000,00000000,00000003 thread_siblings_list = 0-1 Intel Core i5-2520M (2 cores, Hyper-Threading on) Core 0 Architectural State 1 (H-T/SMT core) Architectural State 0 (H-T/SMT core) Core 1 Architectural State 1 (H-T/SMT core) Architectural State 0 (H-T/SMT core) Intel Core i5-2520M: package 0
  • 29. CPU Topology GNU/Linux (/sys) 2929 $ ls /sys/devices/system/cpu/cpu3/topology/ total 0 drwxr-xr-x. 2 root root 0 Sep 29 08:05 . drwxr-xr-x. 8 root root 0 Sep 29 08:05 .. -r--r--r--. 1 root root 4096 Sep 29 08:05 core_id -r--r--r--. 1 root root 4096 Sep 29 08:05 core_siblings -r--r--r--. 1 root root 4096 Sep 29 15:56 core_siblings_list -r--r--r--. 1 root root 4096 Sep 29 08:05 physical_package_id -r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings -r--r--r--. 1 root root 4096 Sep 29 08:05 thread_siblings_list Logical CPU3 physical_package_id = 0 core_id = 1 core_siblings = 00000000,00000000,00000000,0000000f core_siblings_list = 0-3 thread_siblings = 00000000,00000000,00000000,0000000c thread_siblings_list = 2-3 Intel Core i5-2520M (2 cores, Hyper-Threading on) Core 0 Architectural State 1 (H-T/SMT core) Core 1 Architectural State 1 (H-T/SMT core) Architectural State 0 (H-T/SMT core) Intel Core i5-2520M: package 0 Architectural State 0 (H-T/SMT core)
  • 30. CPU Topology GNU/Linux (/proc) 3030 $ cat /proc/cpuinfo processor : 0 physical id : 0 siblings : 4 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 processor : 1 physical id : 0 siblings : 4 core id : 0 cpu cores : 2 apicid : 1 initial apicid : 1 processor : 2 physical id : 0 siblings : 4 core id : 1 cpu cores : 2 apicid : 2 initial apicid : 2 Intel Core i5-2520M (2 cores, Hyper-Threading on)
  • 31. CPU Topology GNU/Linux (dmidecode) 3131 # dmidecode -t processor SMBIOS 2.6 present. Handle 0x0001, DMI type 4, 42 bytes Processor Information Socket Designation: CPU Family: Core i5 Manufacturer: Intel(R) Corporation ID: A7 06 02 00 FF FB EB BF Signature: Type 0, Family 6, Model 42, Stepping 7 Flags: ... Version: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz External Clock: 100 MHz Max Speed: 2500 MHz Current Speed: 2500 MHz L1 Cache Handle: 0x0002 L2 Cache Handle: 0x0003 L3 Cache Handle: 0x0004 Asset Tag: None Part Number: None Core Count: 2 Core Enabled: 2 Thread Count: 4 Characteristics: 64-bit capable
  • 32. CPU Topology GNU/Linux (turbostat) 3232 $ ~/linux-3.11.2/tools/power/x86/turbostat cor CPU %c0 GHz TSC SMI %c1 %c3 %c6 %c7 CTMP PTMP %pc2 %pc3 %pc6 %pc7 Pkg_W Cor_W GFX_W 2.37 2.99 2.49 0 97.63 0.00 0.00 0.00 66 68 0.00 0.00 0.00 0.00 13.90 10.65 0.19 0 0 2.59 2.99 2.49 0 97.41 0.00 0.00 0.00 66 68 0.00 0.00 0.00 0.00 13.90 10.65 0.19 0 1 1.14 2.99 2.49 0 98.86 1 2 5.07 2.99 2.49 0 94.93 0.00 0.00 0.00 63 1 3 0.69 2.99 2.49 0 99.31 turbostat – утилита, входящая в состав ядра Linux, для отображения топологии процессоров, их текущей частоты и информации о энергопотреблении (power-state) turbostat использует инструкцию CPUID Source code: linux/tools/power/x86/turbostat/turbostat.c Intel Core i5-2520M (2 cores, Hyper-Threading on)
  • 33. CPU Topology GNU/Linux (hwloc) 3333 $ lstopo ./topo.png hwloc – пакет, собирающий информацию о топологии процессоров и кеш-памяти машины lstopo – формирует файл (png, pdf, xml) с топологией машины lstopo-no-graphics – выводит топологию машины в консоль http://www.open-mpi.org/projects/hwloc/
  • 34. CPU Topology GNU/Linux (hwloc) 3434 $ lstopo-no-graphics Machine (7873MB) Socket L#0 + L3 L#0 (3072KB) L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 PU L#0 (P#0) PU L#1 (P#1) L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 PU L#2 (P#2) PU L#3 (P#3) HostBridge L#0 PCI 8086:0126 GPU L#0 "card0" GPU L#1 "controlD64" PCI 8086:1502 Net L#2 "em1" PCIBridge PCI 8086:0084 Net L#3 "wlp3s0" PCI 8086:1c03 Block L#4 "sda" Intel Core i5-2520M (2 cores, Hyper-Threading on) http://www.open-mpi.org/projects/hwloc/
  • 35. CPU Topology Microsoft Windows 3535 Пакет hwloc (Windows build) Функции для получения информации о топологии машины (MSDN) o GetNumaHighestNodeNumber o GetProcessAffinityMask o GetNumaProcessorNode o GetNumaNodeProcessorMask CPUID Intel 64 Architecture Processor Topology Enumeration // http://software.intel.com/en-us/articles/intel-64-architecture-processor- topology-enumeration
  • 36. Processor affinity (CPU pinning) 3636 Process affinity (CPU pinning) – это принудительная привязка процесса/потока к логическому процессору (планировщик операционной системы не будет переносить процесс/поток на другой процессор) Причины: нежелательная миграция процесса/потока на другой процессор может привести к неэффективному использованию кеш-памяти выделение памяти с заданного NUMA-узла (например, только с локального – ближайшего) избежание назначения двух потоков на два аппаратных SMT-потока (Hyper-Threading) одного физического ядра (для избежание конкуренции за ресурсы конвейера ядра)
  • 37. GNU/Linux CPU affinity 3737 taskset – позволяет привязать процесс (новый или запущенный) к заданным логическим процессорам 3737Core 0 Architectural State 1 (H-T/SMT core) Core 1 Architectural State 1 (H-T/SMT core) Architectural State 0 (H-T/SMT core) dgemm CPU0 CPU1 CPU2 CPU3 $ taskset –c 2 ./dgemm Architectural State 0 (H-T/SMT core) $ taskset –c 0,1,2 ./dgemm # К любому из 3-х CPU $ taskset –p 1553 # Информация о привязке процесса 1553 pid 1553's current affinity mask: f
  • 38. GNU/Linux CPU affinity 3838 3838Core 0 Architectural State 1 (H-T/SMT core) Core 1 Architectural State 1 (H-T/SMT core) Architectural State 0 (H-T/SMT core) dgemm CPU0 CPU1 CPU2 CPU3 $ taskset -c 0 ./dgemm & # Launch 2 process in parallel $ taskset -c 1 ./dgemm Elapsed time: 3.503317 sec. Elapsed time: 3.706128 sec. Architectural State 0 (H-T/SMT core) dgemm Intel Core i5-2520M
  • 39. GNU/Linux CPU affinity 3939 3939Core 0 Architectural State 1 (H-T/SMT core) Core 1 Architectural State 1 (H-T/SMT core) Architectural State 0 (H-T/SMT core) dgemm CPU0 CPU1 CPU2 CPU3 $ taskset -c 0 ./dgemm & # Launch 2 process in parallel $ taskset -c 2 ./dgemm Elapsed time: 2.310566 sec. Elapsed time: 2.364204 sec. Architectural State 0 (H-T/SMT core) dgemm Speedup 1.57 $ ./dgemm & # Default pinning (OS scheduler) $ ./dgemm Elapsed time: 2.171322 sec. Elapsed time: 2.168358 sec.
  • 40. #include <pthread.h> int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset); GNU/Linux CPU affinity 4040 #include <sched.h> int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); int sched_getcpu(void); int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
  • 41. GNU/Linux NUMA policy library 4141 Linux NUMA policy – набор системных вызовов, библиотек и утилит для управления памятью и процессами на NUMA-системах Системные вызовы: get_mempolicy(), set_mempolicy(), mbind(), migrate_pages(), move_pages(), … Библиотека libnuma Утилиты: numactl, numastat NUMA-узлы (nodes): /sys/devices/system/node/nodeX
  • 42. GNU/Linux NUMA policy library 4242 $ numactl --hardware available: 1 nodes (0) node 0 cpus: 0 1 2 3 node 0 size: 7873 MB node 0 free: 195 MB node distances: node 0 0: 10 $ numactl --show # NUMA policy of the current process policy: default preferred node: current physcpubind: 0 1 2 3 cpubind: 0 nodebind: 0 membind: 0 Intel Core i5-2520M
  • 43. GNU/Linux NUMA policy library 4343 Привязать процесс (и его дочерние процессы) к процессорам указанных NUMA-узлов, память выделять только с указанных узлов $ numactl --cpunodebind=0 --membind=0 ./dgemm Привязать процесс (и его дочерние процессы) к логическим процессорам согласно нумерации поля “processor” файла /proc/cpuinfo $ numactl --physcpubind=1 ./dgemm Опции numactl: o --localalloc – выделять память только с локального NUMA-узла o --preferred=node – выделять память с узла node, если невозможно, выделить с других узлов o --interleave=nodes – выделяет память с указанных NUMA-узлов в режиме чередования страниц (interleave)
  • 44. GNU/Linux libnuma API 4444 #include <numa.h> /* cc ... –lnuma */ int numa_available(void); void numa_bind(struct bitmask *nodemask); int numa_run_on_node_mask(struct bitmask *nodemask); int numa_sched_setaffinity(pid_t pid, struct bitmask *mask); void numa_set_preferred(int node); void numa_set_interleave_mask(struct bitmask *nodemask); void numa_set_localalloc(void); void numa_set_membind(struct bitmask *nodemask); /* ... */ A NUMAAPI for LINUX // http://developer.amd.com/wordpress/media/2012/10/LibNUMA-WP-fv1.pdf
  • 45. Microsoft Windows CPU Affinity 4545 Windows Task Manager -> Processes -> Set Affinity… Microsoft Windows 7, 8, Vista C:> start /affinity 3 dgemm.exe // C++ BOOL WINAPI SetProcessAffinityMask(_In_ HANDLE hProcess, _In_ DWORD_PTR dwProcessAffinityMask ); DWORD_PTR WINAPI SetThreadAffinityMask(_In_ HANDLE hThread, _In_ DWORD_PTR dwThreadAffinityMask ); // C# public static extern bool SetProcessAffinityMask(SafeProcessHandle handle, IntPtr mask); public static extern IntPtr SetThreadAffinityMask(SafeThreadHandle handle, HandleRef mask);
  • 46. Microsoft Windows CPU Affinity 4646 // Windows NUMA API BOOL WINAPI GetNumaProcessorNode(_In_ UCHAR Processor, _Out_ PUCHAR NodeNumber); BOOL WINAPI GetNumaNodeProcessorMask(_In_ UCHAR Node, _Out_ PULONGLONG ProcessorMask); BOOL WINAPI GetNumaAvailableMemoryNode(_In_ UCHAR Node, _Out_ PULONGLONG AvailableBytes); LPVOID WINAPI VirtualAllocExNuma(_In_ HANDLE hProcess, _In_opt_ LPVOID lpAddress, _In_ SIZE_T dwSize, _In_ DWORD flAllocationType, _In_ DWORD flProtect, _In_ DWORD nndPreferred); /* ... */ MSDN NUMA Support // http://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).aspx
  • 47. Программный инструментарий 4747Hardware (Multi-core processors, SMP/NUMA) Kernel thread Process/thread scheduler Системные вызовы (System calls) GNU/Linux Pthreads Apple OS X Cocoa, Pthreads Уровень ядра (Kernel space) Операционная система (Operating System) GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, … Kernel thread Kernel thread … Уровень пользователя (User space) Системные библиотеки (System libraries) Thread Thread Thread Thread… Win32 API/.NET Threads Thread Thread Thread Thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Intel Threading Building Blocks (TBB) Microsoft Concurrency Runtime Apple Grand Central Dispatch Boost Threads Qthread, MassiveThreads Прикладные библиотеки Языки программирования OpenMP (C/C++/Fortran) Intel Cilk Plus С++11 Threads C11 Threads C# Threads Java Threads Erlang Threads Haskell Threads
  • 48. Программный инструментарий 4848Hardware (Multi-core processors, SMP/NUMA) Kernel thread Process/thread scheduler Системные вызовы (System calls) GNU/Linux Pthreads Apple OS X Cocoa, Pthreads Уровень ядра (Kernel space) Операционная система (Operating System) GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, … Kernel thread Kernel thread … Уровень пользователя (User space) Системные библиотеки (System libraries) Thread Thread Thread Thread… Win32 API/.NET Threads Thread Thread Thread Thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Intel Threading Building Blocks (TBB) Microsoft Concurrency Runtime Apple Grand Central Dispatch Boost Threads Qthread, MassiveThreads Прикладные библиотеки Языки программирования OpenMP (C/C++/Fortran) Intel Cilk Plus С++11 Threads C11 Threads C# Threads Java Threads Erlang ThreadsОперационная система обеспечивает поддержку процессов и потоков уровня ядра (kernel threads) Планировщик реализует алгоритм распределения процессорного времени между потоками/процессами Пользователь создает/уничтожает потоки/процессы через интерфейс системных вызовов (system calls)
  • 49. Программный инструментарий 4949Hardware (Multi-core processors, SMP/NUMA) Kernel thread Process/thread scheduler Системные вызовы (System calls) GNU/Linux Pthreads Apple OS X Cocoa, Pthreads Уровень ядра (Kernel space) Операционная система (Operating System) GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, … Kernel thread Kernel thread … Уровень пользователя (User space) Системные библиотеки (System libraries) Thread Thread Thread Thread… Win32 API/.NET Threads Thread Thread Thread Thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Intel Threading Building Blocks (TBB) Microsoft Concurrency Runtime Apple Grand Central Dispatch Boost Threads Qthread, MassiveThreads Прикладные библиотеки Языки программирования OpenMP (C/C++/Fortran) Intel Cilk Plus С++11 Threads C11 Threads C# Threads Java Threads Erlang Threads Haskell Threads Системные библиотеки (Pthreads, .NET Threads, Apple Cocoa) используют системные вызовы и реализуют более высокоуровневое API для работы с потоками В системных библиотеках принимается решение как отображать user-space-потоки в kernel-space-потоки: one-to-one mapping (GNU/Linux, Windows), one-to-many, many-to-many, many-to-one
  • 50. Программный инструментарий 50Hardware (Multi-core processors, SMP/NUMA) Kernel thread Process/thread scheduler Системные вызовы (System calls) GNU/Linux Pthreads Apple OS X Cocoa, Pthreads Уровень ядра (Kernel space) Операционная система (Operating System) GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, … Kernel thread Kernel thread … Уровень пользователя (User space) Системные библиотеки (System libraries) Thread Thread Thread Thread… Win32 API/.NET Threads Thread Thread Thread Thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Intel Threading Building Blocks (TBB) Microsoft Concurrency Runtime Apple Grand Central Dispatch Boost Threads Qthread, MassiveThreads Прикладные библиотеки Языки программирования OpenMP (C/C++/Fortran) Intel Cilk Plus С++11 Threads C11 Threads C# Threads Java Threads Erlang Threads Haskell Threads Высокоуровневые языки, их расширения и библиотеки могут реализовывать на базе потоков системных библиотек (POSIX Pthreads, Windows Threads) легковесные потоки – задачи (tasks, lightweight threads) Причины: сокращение издержек, связанных с созданием потоков, поддержанием их функционирования и переключением контекстов Примеры: задачи в OpenMP (#pragma omp task), Intel TBB (task_group::run), Intel Cilk Plus (cilk_spawn), Примеры: библиотеки легковесных user-level-потоков Qthread, MassiveThreads Виртуальные машины и интерпретаторы некоторых языков реализуют user-level-потоки (green threads): Haskell, Go, Lua, Ruby < v1.9 User-level threads (tasks) System library threads (pthreads, Win32 threads) Kernel threads 50
  • 51. Процессы и потоки 5151 Инструкции (Instructions) Инициализированные данные (Initialized data) ELF/PE File Исполняемый файл (Image) на диске – программа (Application, Program) Запущенная программа – процесс (Process) с одним потоком выполнения Memory Инструкции (Instructions) Инициализированные данные (Initialized data) Неинициализированные данные (Uninitialized data) Куча (Heap – Virtual Memory) Данные библиотек (Library data) Инструкции библиотек (Library instructions) Stack Registers Поток 0 (Thread 0)
  • 52. Многопоточный процесс (Multithreaded) 5252 Memory Инструкции (Instructions) Инициализированные данные (Initialized data) Неинициализированные данные (Uninitialized data) Куча (Heap – Virtual Memory) Данные библиотек (Library data) Инструкции библиотек (Library instructions) Stack Registers Поток 0 (Thread 0) Stack Registers Поток 1 (Thread 1) Stack Registers Поток 2 (Thread 2) Stack Registers Поток 3 (Thread 3) Stack Registers Поток 4 (Thread 4) Stack Registers Поток 5 (Thread 5) Каждый поток имеет свой стек и память для хранения значения архитектурных регистров при переключении контекстов (context switching) Куча процесса, инструкции, статические данные (инициализированные) общие для всех потоков
  • 53. Main memory Multiprocess vs. Multithreaded program 5353 Однопоточный процесс обращается к памяти Cache Thread 0 Heap Virtual addr. v[0] TLB v[0], v[1], v[2] // Mem -> Reg movl v[0], %eax Physical Addr. v[0] Physical addr. v[0] Главный поток процесса обращается к элементу массива v[0] в его памяти (куче) Виртуальный адрес v[0] преобразуется в физический: находится запись в кеш-памяти TLB или при помощи ядра По физическому адресу данный загружаются из кеш-памяти или оперативной памяти в регистр Process
  • 54. Main memory Multiprocess vs. Multithreaded program 5454 Многопоточная программа (Multithreaded application) Cache Thread 0 Heap Virtual addr. v[0] TLB v[0], v[1], v[2] Physical Addr. v[0] V[0] Proc1 Physical addr. v[0] Thread 1 Process Запустили процесс с двумя потоками, оба потока читают v[0] Виртуальные адреса v[0] в обеих потоках совпадают – потоки разделяют общую память Физические адреса v[0] в каждом потоке также совпадают, страницы памяти выделяются процессу и совместно используются потоками Process 1
  • 55. Main memory Multiprocess vs. Multithreaded program 5555 Многопроцессная программа (Multi-process application) Cache Thread 0 Heap Virtual addr. v[0] TLB v[0], v[1], v[2] Physical Addr. v[0] V[0] Proc1 Physical addr. v[0] Запустили 2 процесса одной и той же программы, оба процесса читают v[0] Виртуальный адрес v[0] в обеих процессах совпадает Физический адрес v[0] в каждом процессе свой, т.к. процессам выделены разные страницы памяти Данные каждого процесса будут занимать местов в TLB, кеш-памяти Thread 0 Heap v[0], v[1], v[2] Process 1 Process 2 V[0] Proc2
  • 56. Main memory Multiprocess vs. Multithreaded program 5656 Многопроцессная программа (Multi-process application) Cache Thread 0 Heap Virtual addr. v[0] TLB v[0], v[1], v[2] Physical Addr. v[0] V[0] Proc1 Physical addr. v[0] Выводы Многопроцессная версия программы будет оказывать большую нагрузку на TLB и кеш-память В многопоточной программе отказ одного потока может привезти к отказу всего приложения Архитектуру приложения следует выбирать под решаемую задачу Thread 0 Heap v[0], v[1], v[2] Process 1 Process 2 V[0] Proc2
  • 57. Memory consistency 5757 В ходе выполнения инструкций на суперскалярном процессоре операции чтения и записи памяти могут быть выполнены в порядке отличном от исходного (out of order execution) Процессор реализует одну из моделей согласованности памяти (Memory consistency): Sequential consistency – операции чтения и записи не переупорядочиваются (strict memory ordering) Relaxed consistency – допустимы некоторые виды переупорядочивания o Loads can be reordered after loads o Loads can be reordered after stores o Stores can be reordered after stores o Stores can be reordered after loads Weak consistency (strict memory ordering) – допустимо любое переупорядочивание операций чтения и записи; для предотвращения переупорядочивания в программе вставляются инструкция “барьер памяти” (memory barrier, membar, memory fence)
  • 58. Memory ordering 58 Type Alpha ARMv7 POWER SPARC PSO x86 x86 oostore AMD64 IA-64 zSeries Loads reordered after loads Y Y Y Y Y Loads reordered after stores Y Y Y Y Y Stores reordered after stores Y Y Y Y Y Y Stores reordered after loads Y Y Y Y Y Y Y Y Y Atomic reordered with loads Y Y Y Y Atomic reordered with stores Y Y Y Y Y Dependent loads reordered Y Incoherent Instruction cache pipeline Y Y Y Y Y Y Y Y 58
  • 59. Memory ordering Intel64 (Core 2 Duo) 5959 Chapter 8.2 [1]: In a single-processor system for memory regions defined as write-back cacheable, the memory-ordering model respects the following principles: Reads are not reordered with other reads. Writes are not reordered with older reads. Writes to memory are not reordered with other writes, with the following exceptions: writes executed with the CLFLUSH instruction; streaming stores (writes) executed with the non temporal move instructions (MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, and MOVNTPD); and string operations (see Section 8.2.4.1). Reads may be reordered with older writes to different locations but not with older writes to the same location. Reads or writes cannot be reordered with I/O instructions, locked instructions, or serializing instructions. Reads cannot pass earlier LFENCE and MFENCE instructions. Writes cannot pass earlier LFENCE, SFENCE, and MFENCE instructions. LFENCE instructions cannot pass earlier reads. SFENCE instructions cannot pass earlier writes. MFENCE instructions cannot pass earlier reads or writes. [1] Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, and 3C: System Programming Guide // http://download.intel.com/products/processor/manual/325384.pdf
  • 60. Weak memory ordering 6060 Имеется переменная count, доступ к которой защищён через lock (критическая секция) Увеличиваем count и освобождаем lock (lock = 0) /* Считаем, что lock уже захвачен */ movl count, %eax incl %eax movl %eax, count movl $0, lock На суперскалярном процессоре со слабым упорядочиванием доступа к памяти (weak ordering of memory) две последние инструкции могут быть переставлены и выполнены в следующем порядке: 1. movl count, %eax 2. incl %eax 3. movl $0, lock 4. movl %eax, count lock будет освобожден прежде чем в count будет записано новое значение, другой поток может захватить lock и успеть загрузить старое значение count Программист должен учитывать реализуемую процессором модель упорядочивания доступа к памяти (memory ordering)
  • 61. Weak memory ordering 6161 1. movl count, %eax 2. incl %eax 3. movl $0, lock 4. movl %eax, count Решение – запретить процессору переставлять две последние инструкции movl /* Считаем, что lock уже захвачен */ movl count, %eax incl %eax movl %eax, count mfence /* ждем пока все операции load/store завершатся */ movl $0, lock mfence – это инструкция “барьер памяти” (memory barrier) гарантирует, что пока не завершатся предшествующие операции load/store новые операции load/store не будут выполнены mfence – performs a serializing operation on all load and store instructions that were issued prior the MFENCE instruction [Intel docs]
  • 62. /* x86, x86_64 */ void _mm_lfence(); /* lfence */ void _mm_sfence(); /* sfence */ void _mm_mfence(); /* mfence */ Memory barrier 6262 Compiler memory barrier – предотвращает перестановку инструкций компилятором (в ходе оптимизации) /* GNU inline assembler */ asm volatile("" ::: "memory"); /* Intel C++ intrinsic */ __memory_barrier(); /* Microsoft Visual C++ */ _ReadWriteBarrier() Hardware memory barrier – предотвращает перестановку инструкций процессором GCC: Built-in functions for atomic memory access // http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Atomic-Builtins.html LLVM Atomic Instructions and Concurrency Guide // http://llvm.org/docs/Atomics.html Linux kernel memory barriers // https://www.kernel.org/doc/Documentation/memory-barriers.txt
  • 63. Модели параллельного программирования 6363 Модели параллельного программирования (Parallel programming models) можно классифицировать по двум признакам: 1) по способу взаимодействия процессов/потоков (process interaction) 2) по методу декомпозиции задачи, способу выражения параллелизма (problem decomposition) Parallel programming models Process interaction Problem decomposition Shared memory (PRAM) Message passing (BSP, LogP, LogGP) Implicit parallelism Task parallelism Data parallelism
  • 64. Модели параллельного программирования 6464 Problem decomposition Task parallelism Язык/библиотека поддерживает конструкции для порождения и управления задачами (потоками) POSIX Pthreads Windows Threads OpenMP Intel Cilk Plus Intel TBB Boost Threads Microsoft Task Parallel Library, … POSIX Pthreads: Data parallelism Язык/библиотека реализует параллельные операции над данными (например, суммирование элементов массива) Intel Array Building Blocks Intel Threading Building Blocks Intel Cilk/C/C++ Array Notations Microsoft Task Parallel Library JVM Ateji PX, … Intel Array Building Blocks: // Create thread pthread_create(&tid, 0, fun, 0); // Sum arrays in parallel dense<f32> A = B + C;
  • 65. Fork-join parallelism 6565 Fork-join – это разновидность параллелизма задач, которая поддерживает две операции для динамического порождения задачи и ожидания их завершения: fork – динамически порождает новую задачу (поток), которая выполняется параллельно с родительской задачей join – дожидается завершения дочерней задачи, объединяет (join) потоки управления родительской задачи и дочерней Как правило, задачи реализуется на базе легковесных потоков, которые динамически распределяются runtime-системой языка/библиотеки по пулу потоков операционной системы Для динамическая балансировка загрузки потоков используется алгоритмы типа work stealing Fork-join используется для распараллеливания рекурсивных алгоритмов типа “Divide & Conquer” Реализации: OpenMP (tasks), Intel Cilk Plus, Microsoft Task Parallel Library, … int fib(int n) { int x, y; if (n < 2) return n; x = cilk_spawn fib(n-1); y = fib(n-2); cilk_sync; return x + y; } fib(n-2) fib(n-1) cilk_sync cilk_spawn
  • 66. Конструкции многопоточного программирования 6666 Конструкции управления потоками o порождение потоков (create, spawn, fork, run, …) o ожидание завершения потоков (join, sync, wait, …) o управление потоками (set_attr, …) Конструкции синхронизации потоков (synchronization) o Критические секции (critical sections) o Семафоры (semaphores) o Взаимные исключения (mutexes) o Блокировки (locks, spin locks, read-write locks) o Барьеры (barriers) o Атомарные операции (atomics, lock-free code) Конструкции для взаимодействия потоков (communications) o Условные переменные (conditional variables) o “Барьеры памяти” (memory barriers, memory fences) o Доступ к локальной памяти потоков (thread local storage)
  • 67. Ссылки 6767 Эхтер Ш., Робертс Дж. Многоядерное программирование. – СПб.: Питер, 2010. – 316 с. Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования. – М.: Вильямс, 2003. – 512 с. Darryl Gove. Multicore Application Programming: for Windows, Linux, and Oracle Solaris. – Addison-Wesley, 2010. – 480 p. Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming. – Morgan Kaufmann, 2008. – 528 p. Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing, Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32 Programs. – Wiley-Interscience, 2005. – 480 p. Anthony Williams. C++ Concurrency in Action: Practical Multithreading. – Manning Publications, 2012. – 528 p. Träff J.L. Introduction to Parallel Computing // http://www.par.tuwien.ac.at/teach/WS12/ParComp.html