ЛЕКЦИЯ 2. Архитектура вычислительных систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
3. ˢ˿˵˶́˷˱˾˹˶˼˶˻̇˹˹
▫ Многоядерные процессоры и
многопроцессорные вычислительные
системы (ВС).
▫ SMP/NUMA-системы.
▫ Аппаратная многопоточность (SMT,
HyperTreading)
▫ Показатели эффективности ВС.
▫ Цели и задачи создания многопоточных
программ
▫ Процессы и потоки
4. ˑ́̆˹̃˶˻̃̄́˱˽˾˿˴˿̀́˿̇˶̂̂˿́˾̌̆˳̌̈˹̂˼˹̃˶˼̍˾̌̆̂˹̂̃˶˽
Одноядерный
процессор
Параллелизм
уровня инструкций
(ILP)
Одноядерный процессор
c поддержкой аппаратной
многопоточности
(Intel HyperThreading,
параллелизм уровня
инструкций)
Многопроцессорные
SMP/NUMA-системы
Параллелизм уровня
потоков (TLP)
Многоядерные
процессоры
Параллелизм уровня
потоков (TLP)
Многоядерные процессоры
с поддержкой аппаратной
многопоточности
Параллелизм уровня потоков
(TLP)
Современные
SMP/NUMA-системы
Параллелизм уровня
потоков (TLP)
1 2 3
4 5 6
9. ▪ Архитектурные решения для обеспечения параллельного
выполнения инструкций
▫ Суперскалярный конвейер (Superscalar pipeline) – исполняющие
модули конвейера присутствуют в нескольких экземплярах (несколько
ALU, FPU, Load/Store-модулей)
▫ Внеочередное исполнение команд (Out-of-order execution) –
переупорядочивание команд для максимально загрузки ALU, FPU,
Load/Store (минимизация зависимости по данным между
инструкциями, выполнение инструкций по готовности их данных)
▫ SIMD-инструкции – модули ALU, FPU, Load/Store поддерживают
операции над векторами (инструкции SSE, AVX, AltiVec, NEON SIMD)
▫ VLIW-архитектура (Very Long Instruction Word) – процессор с широким
командным словом оперирует с инструкциями, содержащими в себе
несколько команд, которые можно выполнять параллельно на
ALU/FPU/Load-Store
(Intel Itanium, Transmeta Efficeon, Texas Instruments TMS320C6x, ЗАО
“МЦСТ” Эльбрус)
12. ,QWHO1HKDOHPRUH3LSHOLQH
16
ITLB L1 I-cache (32 KiB, 4-way)
byte/cycle
Instruction
Fetch Unit
(IFU)
Pre Decode,
Prefetch Buffer,
Instruction Length
Decoder
Instruction Queue (IQ)
(18 entry – 18 instruction max.)
Instruction Decoding Unit (IDU)
3 simple + 1 complex
Simple Complex
Simple Simple micro-cod
Decoded Instruction Queue (DIQ, 28 uops. max)
Loop Stream Detection, Micro-Fusion, Macro-
Fusion
Intel64 CISC
macro-instr.
Nehalem
RISC
micro-operations
4 micro-ops.
/cycle
Unified L2-
Cache
6 instr./cycle
Branch
Prediction
Unit (BPU)
5 instructions/cycle
4 uops./cycle
IFU на каждом такте
выбирает
из кэша L1 (через ITLB)
16 байт инструкций и
передает их на
предекодирование в Pre
Decode
Pre Decode определяет
длину инструкций, их
префиксы и типы
(условный/безусловный
переход, …)
и передает информацию
в Instruction Queue
1 2
13. ,QWHO1HKDOHPRUH3LSHOLQH
▪ IDU преобразует Intel64-инструкции в RISC-микрооперации (uops,
сложные инструкции ITLB преобразуются L1 I-cache в несколько (32 KiB, микроопераций)
4-way)
16
▪ IDU передает микрооперации в очередь DIQ, где выполняется byte/cycle
поиск
циклов
Instruction
Fetch Unit
(LSD, для предотвращения их повторного декодирования), слияние
микроопераций
(IFU)
(для увеличения пропускной способности FEP) и другие оптимизации
▪ Поток RISC-микроопераций передается в исполняющее ядро
Pre Decode,
Prefetch Buffer,
Instruction Length
Decoder
Instruction Queue (IQ)
(18 entry – 18 instruction max.)
Instruction Decoding Unit (IDU)
3 simple + 1 complex
Simple Complex
Simple Simple micro-cod
Decoded Instruction Queue (DIQ, 28 uops. max)
Loop Stream Detection, Micro-Fusion, Macro-
Fusion
Intel64 CISC
macro-instr.
Nehalem
RISC
micro-operations
4 micro-ops.
/cycle
Unified L2-
Cache
6 instr./cycle
Branch
Prediction
Unit (BPU)
5 instructions/cycle
4 uops./cycle
3
14. ,QWHO1HKDOHP([HFXWLRQRUH
Frontend Pipeline (DIQ)
4 micro-ops./cycle
Register Renaming, Resource Allocation (RRRA)
Retirement Unit (RU),
ReOrder Buffer (ROB, 128
uops)
Unified Reservation Station (dynamic scheduler, 36 micro-ops)
Port 0 Port 1 Port 2 Port 3 Port 4 Port 5
Int. ALU,
Shift
FMUL, FDIV
SSE Int.
ALU, Int.
Shuffles
Int. ALU,
LEA
FP Add
Complex
Int.
SSE Int. Mul
Load
Store
Address
Store Data
Int. ALU,
Shift
Branch
FP Shuffle
SSE Int.
ALU, Int.
Shuffles
Memory Order Buffer (MOB)
▪ 6 micro-ops./cycle Data TLB
L2 TLB
L1 Data Cache (32 KiB) L2
Cache
15. ,QWHO1HKDOHP([HFXWLRQRUH
Frontend Pipeline (DIQ)
4 micro-ops./cycle
Register Renaming, Resource Allocation (RRRA)
Retirement Unit (RU),
ReOrder Buffer (ROB, 128
uops)
Resource Allocation – выделяет
для поступающих
микроопераций блоки
в Re-Order Buffer, Reservation
Station, привязывает
микрооперации к порту выдачи
(dispatch port)
Register Renaming –
переименовывает
архитектурные регистры (RAX,
RBX, …), используемые в
микрооперации в
микроархитектурные регистры
для предотвращения конфликтов
данных
(Data hazards)
Unified Reservation Station (dynamic scheduler, 36 micro-ops)
Port 0 Port 1 Port 2 Port 3 Port 4 Port 5
Int. ALU,
Shift
FMUL, FDIV
SSE Int.
ALU, Int.
Shuffles
Int. ALU,
LEA
FP Add
Complex
Int.
SSE Int. Mul
Load
Store
Address
Store Data
Int. ALU,
Shift
Branch
FP Shuffle
SSE Int.
ALU, Int.
Shuffles
Memory Order Buffer (MOB)
▪ 6 micro-ops./cycle Data TLB
L2 TLB
L1 Data Cache (32 KiB) L2
Cache
4
16. ,QWHO1HKDOHP([HFXWLRQRUH
Frontend Pipeline (DIQ)
4 micro-ops./cycle
Register Renaming, Resource Allocation (RRRA)
Retirement Unit (RU),
ReOrder Buffer (ROB, 128
uops)
Unified Reservation Station (dynamic scheduler, 36 micro-ops)
Port 0 Port 1 Port 2 Port 3 Port 4 Port 5
▪ URS – пул Int. из ALU,
36 микроопераций Int. ALU,
Load
+ динамический Store
планировщик
Int. ALU,
Store Data
Shift
LEA
Address
Shift
▪ Если операнды микрооперации готовы, она направляется на одно их
исполняющих FMUL, FDIV
устройств FP Add
– выполнение по готовности данных Branch
(максимум 6
микроопераций/такт Complex
– 6 портов)
SSE Int.
▪ URS реализует ALU, Int.
разрешения Int.
некоторых конфликтов данных – передает
результат Shuffles
выполненной SSE Int. операции Mul
напрямую на вход другой (если требуется,
FP Shuffle
SSE Int.
ALU, Int.
Shuffles
Memory Order Buffer (MOB)
▪ 6 micro-ops./cycle Data TLB
L2 TLB
L1 Data Cache (32 KiB) L2
Cache
forwarding, bypass)
5
17. ,QWHO1HKDOHP([HFXWLRQRUH
Frontend Pipeline (DIQ)
4 micro-ops./cycle
Register Renaming, Resource Allocation (RRRA)
Retirement Unit (RU),
ReOrder Buffer (ROB, 128
uops)
▪ ROB – хранит микрооперации с
их состояниями в исходном
порядке (in-order)
▪ RU – отслеживает, чтобы запись
результатов
в архитектурные регистры
выполнялась
в прямой последовательности
Unified Reservation Station (dynamic scheduler, 36 micro-ops)
Port 0 Port 1 Port 2 Port 3 Port 4 Port 5
Int. ALU,
Shift
FMUL, FDIV
SSE Int.
ALU, Int.
Shuffles
Int. ALU,
LEA
FP Add
Complex
Int.
SSE Int. Mul
Load
Store
Address
Store Data
Int. ALU,
Shift
(исходной программы)
▪ Выполнение Intel64-Branch
инструкции
считается завершенным, если
FP Shuffle
а) все её микрооперации
SSE Int.
выполнены,
ALU, Int.
б) все более ранние Shuffles
операции
завершены
Memory Order Buffer (MOB)
▪ 6 micro-ops./cycle Data TLB
L2 TLB
L1 Data Cache (32 KiB) L2
Cache
6
19. ▪ Одновременная многопоточность
(Simultaneous multithreading – SMT, hardware
multithreading) — технология, позволяющая выполнять
инструкции из нескольких потоков выполнения (программ)
на одном суперскалярном конвейере
▪ Потоки разделяют один суперскалярный конвейер
процессора
(ALU, FPU, Load/Store)
▪ SMT позволяет повысить эффективность использования
модулей суперскалярного процессора (ALU, FPU, Load/Store)
за счет наличия большего количества инструкций из разных
потоков выполнения
(ниже вероятность зависимости по данным)
Thread 1 Thread 2
Superscalar
pipeline
▪ Примеры реализации:
❑ IBM ACS-360 (1968 г.), DEC Alpha 21464 (1999 г., 4-way SMT)
❑ Intel Pentium 4 (2002 г., Intel Hyper-Threading, 2-way SMT)
❑ Intel Xeon Phi (4-way SMT), Fujitsu Sparc64 VI (2-way SMT), IBM POWER8
Разделение ресурсов
ALU, FPU, Load/Store
(8-way SMT)
21. ˝˾˿˴˿̀́˿̇˶̂̂˿́˾̌˶603̂˹̂̃˶˽̌
Cache
CPU 1
Shared memory (RAM)
Cache
CPU 2
Cache
CPU N
I/O
Bus
Arbiter
System bus
▪ Процессоры SMP-системы имеют одинаковое время доступа к
разделяемой памяти (симметричный доступ)
▪ Системная шина (System bus) – это узкое место, ограничивающее
масштабируемость вычислительного узла
23. ▪ NUMA (Non-Uniform Memory Architecture) – это архитектура вычислительной
системы
с неоднородным доступом к разделяемой памяти
▪ Процессоры сгруппированы в NUMA-узлы со своей локальной памятью
▪ Доступ к локальной памяти NUMA-узла занимает меньше времени по сравнению
с временем доступом к памяти удаленных процессоров
Remote access
(slow)
Local access
(fast)
▪ 4-х процессорная NUMA-система
▪ Каждый процессор имеет
интегрированный контроллер
и несколько банков памяти
▪ Процессоры соединены шиной
Hyper-Transport
(системы на базе процессоров AMD)
▪ Доступ к удаленной памяти
занимает больше времени
(для Hyper-Transport ~ на 30%, 2006)
25. ▪ 4-х процессорная
NUMA-система
▪ Каждый процессор
имеет интегрированный
контроллер и несколько
банков памяти
▪ Процессоры соединены
шиной Intel QuickPath
Interconnect (QPI) –
решения на базе
процессоров Intel
CPU 0 CPU 1
Memory Memory
Intel Nehalem based systems with QPI
2-way Xeon 5600 (Westmere) 6-core, 2 IOH
26. ˠ˿˼˹̃˹˻˱̄̀́˱˳˼˶˾˹̐̀˱˽̐̃˹180$̂˹̂̃˶˽̌
▪ Политики управления памятью можно задавать
в настройках BIOS/UEFI:
▪ NUMA Mode – в системе присутствует
несколько
NUMA-узлов, у каждого узла имеется своя
локальная память (local), операционная система
учитывает топологию системы при выделении
памяти
▪ Node Interleave – память циклически
выделяется со всех NUMA-узлов (чередование),
операционная система “видит” NUMA-систему
как SMP-машину
Memory latency and bandwidth accessing local,
remote memory for a PowerEdge R610 server
(Dual Intel Xeon X5550 Nehalem, 6 x 4GB 1333
MHz RDIMMS)
28. Логический процессор
Architectural State
Backend
Вычислительное ядро
(Execution Engine)
Core 0 Core 1
Кэш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP
Сhip
Логический процессор
Architectural State
Backend
Вычислительное ядро
(Execution Engine)
Кэш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP
TLP
▪ Процессорные ядра размещены на одном чипе (Processor chip)
▪ Ядра процессора могу разделять некоторые ресурсы
(например, кэш-память)
▪ Многоядерный процессор реализует параллелизм уровня потоков
(Thread level parallelism – TLP)
29. ˝˾˿˴˿̐˵˶́˾̌˶̀́˿̇˶̂̂˿́̌̂̀˿˵˵˶́˷˻˿˺607
Логический
процессор
Architectural State
Backend
Вычислительное ядро
(Execution Engine)
Кэш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP
Логический
процессор
Architectural
State
Backend
Вычислительное ядро
(Execution Engine)
Кэш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP
TLP
Логический
процессор
Architectural State
Логический
процессор
Architectural
State
▪ Многоядерный процессор может поддерживать одновременную многопоточность
(Simultaneous multithreading – SMT, Intel Hyper-threading, Fujitsu Vertical
Multithreading)
▪ Каждое ядро может выполнять несколько потоков на своем суперскалярном
конвейере (2-way SMT, 4-way SMT, 8-way SMT)
▪ Операционная система представляет каждый SMT-поток как логический процессор
30. ˝˾˿˴˿̐˵˶́˾̌˶̀́˿̇˶̂̂˿́̌̂̀˿˵˵˶́˷˻˿˺607
Thread 0 Thread Level Parallelism + Thread 1
Логический
процессор
Architectural State
Backend
Вычислительное ядро
(Execution Engine)
Кэш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP
Логический
процессор
Architectural
State
Backend
Вычислительное ядро
(Execution Engine)
Кэш-
память
(Cache)
Frontend
(Fetch, Decode)
ILP
TLP
Логический
процессор
Architectural State
Логический
процессор
Architectural
State
Instruction Level Parallelism
▪ Операционная система видит 4 логических процессора
▪ Потоки 0 и 1 выполняются на суперскалярных конвейерах разных ядер
▪ Задействован параллелизм уровня потоков (TLP) и инструкций (ILP)
33. ˢ̀˶̇˹˱˼˹˸˹́˿˳˱˾˾̌˶̄̂˻˿́˹̃˶˼˹,QWHO;HRQ3KL
▪ Intel Xeon Phi (Intel MIC): 64 cores Intel P54C
(Pentium)
▪ Pipeline: in-order, 4-way SMT, 512-bit SIMD
▪ Кольцевая шина (1024 бит, ring bus) для связи
ядер
и контроллера памяти GDDR5
▪ Устанавливается в PCI Express слот
The Tianhe-2 Xeon Phi drawer in action
http://www.theregister.co.
uk/Print/2013/06/10/inside_chinas_tianhe2_massiv
e_hybrid_supercomputer/
http://www.intel.ru/content/www/ru/ru/processors/xeon/xeon-phi-detail.
html
SMP-система
256 логических
процессоров
34. ˢ̀˶̇˹˱˼˹˸˹́˿˳˱˾˾̌˶̄̂˻˿́˹̃˶˼˹*UDSKLFV3URFHVVLQJ8QLW
▪ Graphics Processing Unit (GPU) – графический процессор,
специализированный многопроцессорный ускоритель с общей памятью
▪ Большая часть площади чипа занята элементарными ALU/FPU/Load/Store
модулями
▪ Устройство управления (Control unit) относительно простое по сравнению
с CPU
NVIDIA GeForce GTX 780
(Kepler, 2304 cores,
GDDR5 3 GB)
AMD Radeon HD 8970
(2048 cores, GDDR5 3 GB)
35. ˢ̀˶̇˹˱˼˹˸˹́˿˳˱˾˾̌˶˽˾˿˴˿̐˵˶́˾̌˶̀́˿̇˶̂̂˿́̌
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
MIPS
Multi-core
processors
36. ˢ̀˶̇˹˱˼˹˸˹́˿˳˱˾˾̌˶˽˾˿˴˿̐˵˶́˾̌˶̀́˿̇˶̂̂˿́̌
▪ Как (на чем) разрабатывать программы для такого
количества
многоядерных архитектур?
▪ Как быть с переносимостью кода программ между
платформами?
▪ Как быть с переносимостью производительности
программ?
▪ Все ли алгоритмы эффективно распараллеливаются?
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
38. ˞˱˹˳˾˱̐˽˿˵˶˼̍˓ˢ̂˿˲̊˶˺̀˱˽̐̃̍̏
Память
ЭП ЭП ЭП ЭП
Процессоры соединены непосредственно с памятью, все
взаимодействия через чтение/запись из памяти
Предполагается, что модель согласованности памяти
соответствует порядку операций в программе: записи и
чтения происходят так, как это выполняется в программе
39. ˞˱˹˳˾˱̐˽˿˵˶˼̍˓ˢ̂˿˲̊˶˺̀˱˽̐̃̍̏
Память
ЭП ЭП ЭП ЭП
▪ процессоры выполняют процессы
▪ процессы не синхронизованы
▪ методы для синхронизации процессов
▪ процессы обмениваются информацией через общую
память
▪ методы для разделения памяти между процессами
40. ˡ˶˱˼̍˾̌˶˱́̆˹̃˶˻̃̄́̌̂˿˲̊˶˺̀˱˽̐̃̍̏
Память
кэш
ЭП ЭП ЭП ЭП
Кэш: небольшая, быстрая память, расположенная
близко к процессору. Сохраняет из основной памяти
блоки, которые затем используются при
вычислениях.
Буфер между процессором и основной памятью.
41. ˡ˶˱˼̍˾̌˶˱́̆˹̃˶˻̃̄́̌̂˿˲̊˶˺̀˱˽̐̃̍̏
Память
кэш
ЭП ЭП ЭП ЭП
Тип памяти Ёмкость Время доступа
Основная память гигабайты 100 циклов
Кэш килобайты, мегабайты 1-20 циклов
Регистры 0-1 циклов
42. ˝˾˿˴˿̄́˿˳˾˶˳˾˱̐̂˹̂̃˶˽˱˻̎̉˱
Память
кэш
кэш
Д И
Уровень 3
Уровень 2
Уровень 1
ЭП ЭП ЭП ЭП
2-3 уровня + специализированные кэши, TLB, кэш инструкций и т.д.
43. 180$̂˹̂̃˶˽̌
Память
Память
кэш
кэш
Д И
Уровень 3
Уровень 2
Уровень 1
ЭП ЭП ЭП ЭП
Кэш решает проблему “узкого места”. При этом изменения в
кэше могут реально применяться в произвольном порядке.
44. ˑ˲̂̃́˱˻̇˹̐̀˱˽̐̃˹
П Память
кэш
Однопроцессорная
ЭВМ: система памяти и
процессор позволяют
обеспечить абстракцию
памяти.
Память
кэш
кэш
Д И
Уровень 3
Уровень 2
Уровень 1
ЭП ЭП ЭП ЭП
ЭП
ВС с общей памятью:
трудно обеспечить
абстракцию единой
однородной памяти.
45. ˑ˲̂̃́˱˻̇˹̐̀˱˽̐̃˹̀́˿˲˼˶˽̌
Память
Память
кэш
кэш
Д И
Уровень 3
Уровень 2
Уровень 1
ЭП ЭП ЭП ЭП
▪ Что случится, если один и тот же адрес находится в разных
кэшах?
▪ Что происходит при изменении записи в один из кэшей одним из
процессоров?
▪ Несколько процессоров записывают или читают из одного
адреса?
47. ˑ˲̂̃́˱˻̇˹̐̀˱˽̐̃˹̀́˿˲˼˶˽̌
Память
Память
кэш
кэш
Д И
Уровень 3
Уровень 2
Уровень 1
ЭП ЭП ЭП ЭП
▪ Что случится, если один и тот же адрес находится в разных
кэшах?
Проблема когерентности кэша
▪ Что происходит при изменении записи в один из кэшей одним из
процессоров?
▪ Несколько процессоров записывают или читают из одного
адреса?
51. ˝˾˿˴˿̀˿̃˿̈˾̌˺̀́˿̇˶̂̂
Memory (RAM)
Инструкции
(Instructions)
Инициализированные
данные (Initialized data)
Неинициализированные
данные (Uninitialized data)
Данные библиотек
(Library data)
Куча (Heap, Virtual Memory)
Инструкции библиотек
(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) – память для хранения
значения архитектурных регистров при переключении контекстов (context
switching) операционной системой
▪ Куча процесса (heap), инструкции, статические данные (инициализированные)
являются общими для всех потоков
52. RQFXUUHQFƧ3DUDOOHOLVP
▪ Concurrency (одновременность) –
два и более потоков выполняются
разделяя одно процессорное ядро
▪ Операционная система реализует
режим разделения времени ядра
процессора (time sharing)
▪ Ускорение вычислений отсутствует
▪ Зачем?
▪ Обеспечение отзывчивости
интерфейса, совмещение
ввода-вывода и вычислений, ...
18 февраля 2014 г.
▪ Parallelism (параллелизм) –
каждый поток выполняется на
отдельном ядре процессора
(нет конкуренции за
вычислительные ресурсы)
▪ Вычисления выполняются
быстрее
56. ▪ Pthreads - интерфейс для потоков семейства стандартов
POSIX
▫ в основе - системные вызовы для создания и синхронизации
потоков
▫ поддерживаются UNIX-подобные операционные системы
▫ IEEE POSIX 1003.1c
▪ Pthreads поддерживает:
▫ реализация параллелизма
▫ синхронизация потоков
▫ нет явной поддержки коммуникаций между потоками:
поскольку общая память неявная, а указатель на общие данные
передаётся в поток
58. Сигнатура:
int pthread_create(pthread_t *,
const pthread_attr_t *,
void * (*)(void *),
void *);
Пример вызова:
errcode = pthread_create(thread_id,
thread_attr,
thread_func,
fun_arg);
thread_id - идентификатор потока (для завершения, синхронизации и т.д.)
thread_attr - параметры потока (например, минимальный размер стека)
thread_func - функция для запуска (принимает и возвращает указатель
void*)
errcode - код ошибки, ≠ 0, если операция завершилась неудачно
59. 3WKUHDGV̀́˹˽˶́
void* hello(void *foo)
{
printf(“Hello, world!n”);
return NULL;
}
int main()
{
pthread_t threads[n];
int ti;
for (ti = 0; ti n; ti++) {
pthread_create(threads[ti], NULL,
hello, NULL);
}
for (ti = 0; ti n; ti++) {
pthread_join(threads[ti], NULL);
}
}
63. int main() {
struct bounds bounds_arg[nthreads];
pthread_t tid[nthreads];
int ti, rc;
for (ti = 0; ti nthreads; ti++) {
bounds_arg[ti].threadnum = ti;
bounds_arg[ti].begin = ti * 10 + 1;
bounds_arg[ti].end = (ti + 1) * 10;
rc = pthread_create(tid[ti], NULL, func,
bounds_arg[ti]);
if (rc != 0) {
fprintf(stderr, pthread_create failed);
}
}
for (ti = 0; ti nthreads; ti++)
pthread_join(tid[ti], NULL);
return 0; }
64. 3WKUHDG̅̄˾˻̇˹˹
▪ pthread_join(pthread_t *thread, void *result);
- дождаться завершения выполнения потока,
результирующее значение поместить в *result
▪ pthread_yield();
- сообщить планировщику, что поток собирается “уступить”
свой квант времени
▪ pthread_exit(void *value);
- выйти из потока и передать значение потоку, в котором
данный поток был вызван
▪ pthread_self();
- позволяет потоку получить свой собственный
идентификатор pthread_t
▪ pthread_detach(thread)
- для завершения данного потока больше не требуется вызов
функции pthread_join
65. ˠ˼˱˾˹́˿˳˱˾˹˶̀˿̃˿˻˿˳
главный тред
тред А тред B
тред С тред D
тред E
время
▪ когда после создания тред должен запускаться
▫ планирование в ОС не позволяет учитывать данное конкретное приложение
и число тредов в нём
▪ программист может “помогать” планированию
▫ создать N потоков и назначить их на N процессорных ядер
▪ можно настроить пользовательское планирование потоков для данной
программы