+ All Categories
Home > Education > ПВТ - осень 2014 - Лекция 2 - Архитектура вычислительных...

ПВТ - осень 2014 - Лекция 2 - Архитектура вычислительных...

Date post: 12-Jul-2015
Category:
Upload: alexey-paznikov
View: 770 times
Download: 7 times
Share this document with a friend
Popular Tags:
55
Параллельные вычислительные технологии Осень 2014 (Parallel Computing Technologies, PCT 14) Лекция 2. Архитектура вычислительных систем с общей памятью Пазников Алексей Александрович Кафедра вычислительных систем СибГУТИ Сайт курса: http://cpct.sibsutis.ru/~apaznikov/teaching/ Вопросы: https://piazza.com/sibsutis.ru/fall2014/pct14/home
Transcript

Параллельные вычислительные технологииОсень 2014 (Parallel Computing Technologies, PCT 14)

Лекция 2. Архитектура вычислительных систем с общей памятью

Пазников Алексей АлександровичКафедра вычислительных систем СибГУТИ

Сайт курса: http://cpct.sibsutis.ru/~apaznikov/teaching/Вопросы: https://piazza.com/sibsutis.ru/fall2014/pct14/home

Содержание лекции

▫ Многоядерные процессоры и многопроцессорные вычислительные системы (ВС).

▫ SMP/NUMA-системы.

▫ Аппаратная многопоточность (SMT, HyperTreading)

▫ Показатели эффективности ВС.

▫ Цели и задачи создания многопоточных программ

▫ Процессы и потоки

Архитектура многопроцессорных вычислительных систем

Одноядерный процессорПараллелизм

уровня инструкций (ILP)

Одноядерный процессор c поддержкой аппаратной

многопоточности (Intel HyperThreading, параллелизм уровня

инструкций)

Многопроцессорные SMP/NUMA-системыПараллелизм уровня

потоков (TLP)

Многоядерные процессоры

Параллелизм уровня потоков (TLP)

Многоядерные процессоры с поддержкой аппаратной

многопоточностиПараллелизм уровня потоков

(TLP)

Современные SMP/NUMA-системыПараллелизм уровня

потоков (TLP)

1 2 3

4 5 6

Архитектура многопроцессорных систем с общей памятью

Архитектура ядра процессора Intel 64

Логический процессор

Architectural State

BackendВычислительное

ядро (Execution Engine)

Кэш-память (Cache)

Frontend (Fetch, Decode)

▪ Логический процессор (Logical processor) представлен архитектурным состоянием и контроллером прерываний (Interrupt controller, APIC)

▪ Архитектурное состояние (Architectural state, AS) включает:

❑ регистры общего назначения (RAX, RBX, …)

❑ сегментные регистры (CS, DS, …),

❑ управляющие регистры (RFLAGS, RIP, GDTR, …)

❑ X87 FPU-регистры, MMX/XMM/YMM-регистры

❑ MSR-регистры, Time stamp counter

ILP

Processor chip

❑ Intel64 and IA-32 Architectures Software Developer Manuals // http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

▪ Логический процессор – это то, что “видит” операционная система

Архитектура ядра процессора Intel 64

▪ Логический процессор использует ресурсы вычислительного ядра (Execution engine)

▪ Frontend реализует выборку, декодирование инструкций, поддерживает очередь для передачи инструкций в Backend

▪ Backend – это вычислительное ядро, менеджер, распределяющий инструкции по исполняющим устройствам ALU, FPU, Load/Store

▪ Backend реализует параллельное выполнение инструкций (Instruction level parallelism – ILP)

Логический процессор

Architectural State

BackendВычислительное

ядро (Execution Engine)

Frontend (Fetch, Decode)

ILP

Processor chip

Кэш-память (Cache)

Параллелизм уровня инструкций (Instruction level parallelism – ILP)

▪ Архитектурные решения для обеспечения параллельного выполнения инструкций▫ Суперскалярный конвейер (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, ЗАО “МЦСТ” Эльбрус)

Intel Nehalem Core Pipeline

Instruction Fetch & PreDecode

Instruction Queue (IQ)

Decode

Rename/Allocate

SchedulerReservation

Stations

Execution Units

Retirement Unit (Re-Order

Buffer)

Intel 64 CISC macro-instructions

Execution Engine

(out-of-order)

ITLB Instruction Cache (32KiB)

L2 TLBL2 Cache

(256 KiB, 8-way)

DTLB Data Cache (32KiB)

L3 Cache

Front-End Pipeline

(in-order)

Nehalem RISCmicro-

operations

Intel 64 CISC macro-instr.

Intel Nehalem Core Pipeline

16 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

Decoded Instruction Queue (DIQ, 28 uops. max) Loop Stream Detection, Micro-Fusion, Macro-

Fusion

Intel64 CISCmacro-instr.

Nehalem RISC

micro-operations

4 micro-ops./cycle

ITLB L1 I-cache (32 KiB, 4-way)

6 instr./cycle

Branch Prediction Unit (BPU)

5 instructions/cycle

4 uops./cycle

Unified L2-Cache

Simple Simple micro-cod

Intel Nehalem Core Pipeline

16 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

Decoded Instruction Queue (DIQ, 28 uops. max) Loop Stream Detection, Micro-Fusion, Macro-

Fusion

Intel64 CISCmacro-instr.

Nehalem RISC

micro-operations

4 micro-ops./cycle

ITLB L1 I-cache (32 KiB, 4-way)

6 instr./cycle

Branch Prediction Unit (BPU)

5 instructions/cycle

4 uops./cycle

Unified L2-Cache

Simple Simple micro-cod

IFU на каждом такте выбирает из кэша L1 (через ITLB) 16 байт инструкций и передает их на предекодирование в Pre Decode

Pre Decode определяет длину инструкций, их префиксы и типы (условный/безусловный переход, …) и передает информацию в Instruction Queue

1 2

Intel Nehalem Core Pipeline

16 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

Decoded Instruction Queue (DIQ, 28 uops. max) Loop Stream Detection, Micro-Fusion, Macro-

Fusion

Intel64 CISCmacro-instr.

Nehalem RISC

micro-operations

4 micro-ops./cycle

ITLB L1 I-cache (32 KiB, 4-way)

6 instr./cycle

Branch Prediction Unit (BPU)

5 instructions/cycle

4 uops./cycle

Unified L2-Cache

Simple Simple micro-cod

▪ IDU преобразует Intel64-инструкции в RISC-микрооперации (uops, сложные инструкции преобразуются в несколько микроопераций)

▪ IDU передает микрооперации в очередь DIQ, где выполняется поиск циклов (LSD, для предотвращения их повторного декодирования), слияние микроопераций (для увеличения пропускной способности FEP) и другие оптимизации

▪ Поток RISC-микроопераций передается в исполняющее ядро

3

Intel Nehalem Execution Core

4 micro-ops./cycleFrontend Pipeline (DIQ)

Register Renaming, Resource Allocation (RRRA)

Retirement Unit (RU), ReOrder Buffer (ROB, 128

uops)

Unified Reservation Station (dynamic scheduler, 36 micro-ops)

Int. ALU,Shift

FMUL, FDIV

SSE Int. ALU, Int. Shuffles

Int. ALU,LEA

FP Add

Complex Int.

SSE Int. Mul

LoadStore

AddressStore Data

Int. ALU,Shift

Branch

FP Shuffle

SSE Int. ALU, Int. Shuffles

Memory Order Buffer (MOB)

Port 0 Port 1 Port 2 Port 3 Port 4 Port 5

Data TLB

L1 Data Cache (32 KiB) L2 Cache

L2 TLB▪ 6 micro-ops./cycle

Intel Nehalem Execution Core

4 micro-ops./cycleFrontend Pipeline (DIQ)

Register Renaming, Resource Allocation (RRRA)

Retirement Unit (RU), ReOrder Buffer (ROB, 128

uops)

Unified Reservation Station (dynamic scheduler, 36 micro-ops)

Int. ALU,Shift

FMUL, FDIV

SSE Int. ALU, Int. Shuffles

Int. ALU,LEA

FP Add

Complex Int.

SSE Int. Mul

LoadStore

AddressStore Data

Int. ALU,Shift

Branch

FP Shuffle

SSE Int. ALU, Int. Shuffles

Memory Order Buffer (MOB)

Port 0 Port 1 Port 2 Port 3 Port 4 Port 5

Data TLB

L1 Data Cache (32 KiB) L2 Cache

L2 TLB▪ 6 micro-ops./cycle

Resource Allocation – выделяет для поступающих микроопераций блоки в Re-Order Buffer, Reservation Station, привязывает микрооперации к порту выдачи (dispatch port)

Register Renaming – переименовывает архитектурные регистры (RAX, RBX, …), используемые в микрооперации в микроархитектурные регистры для предотвращения конфликтов данных (Data hazards)

4

Intel Nehalem Execution Core

4 micro-ops./cycleFrontend Pipeline (DIQ)

Register Renaming, Resource Allocation (RRRA)

Retirement Unit (RU), ReOrder Buffer (ROB, 128

uops)

Unified Reservation Station (dynamic scheduler, 36 micro-ops)

Int. ALU,Shift

FMUL, FDIV

SSE Int. ALU, Int. Shuffles

Int. ALU,LEA

FP Add

Complex Int.

SSE Int. Mul

LoadStore

AddressStore Data

Int. ALU,Shift

Branch

FP Shuffle

SSE Int. ALU, Int. Shuffles

Memory Order Buffer (MOB)

Port 0 Port 1 Port 2 Port 3 Port 4 Port 5

Data TLB

L1 Data Cache (32 KiB) L2 Cache

L2 TLB▪ 6 micro-ops./cycle

▪ URS – пул из 36 микроопераций + динамический планировщик▪ Если операнды микрооперации готовы, она направляется на одно их исполняющих устройств – выполнение по готовности данных (максимум 6 микроопераций/такт – 6 портов)

▪ URS реализует разрешения некоторых конфликтов данных – передает результат выполненной операции напрямую на вход другой (если требуется, forwarding, bypass)

5

Intel Nehalem Execution Core

4 micro-ops./cycleFrontend Pipeline (DIQ)

Register Renaming, Resource Allocation (RRRA)

Retirement Unit (RU), ReOrder Buffer (ROB, 128

uops)

Unified Reservation Station (dynamic scheduler, 36 micro-ops)

Int. ALU,Shift

FMUL, FDIV

SSE Int. ALU, Int. Shuffles

Int. ALU,LEA

FP Add

Complex Int.

SSE Int. Mul

LoadStore

AddressStore Data

Int. ALU,Shift

Branch

FP Shuffle

SSE Int. ALU, Int. Shuffles

Memory Order Buffer (MOB)

Port 0 Port 1 Port 2 Port 3 Port 4 Port 5

Data TLB

L1 Data Cache (32 KiB) L2 Cache

L2 TLB▪ 6 micro-ops./cycle

▪ ROB – хранит микрооперации с их состояниями в исходном порядке (in-order)

▪ RU – отслеживает, чтобы запись результатов в архитектурные регистры выполнялась в прямой последовательности (исходной программы)

▪ Выполнение Intel64-инструкции считается завершенным, если а) все её микрооперации выполнены,б) все более ранние операции завершены

6

Одновременная многопоточность (Simultaneous Multithreading)

▪ Одновременная многопоточность (Simultaneous multithreading – SMT, hardware multithreading) — технология, позволяющая выполнять инструкции из нескольких потоков выполнения (программ) на одном суперскалярном конвейере

▪ Потоки разделяют один суперскалярный конвейер процессора (ALU, FPU, Load/Store)

▪ SMT позволяет повысить эффективность использования модулей суперскалярного процессора (ALU, FPU, Load/Store) за счет наличия большего количества инструкций из разных потоков выполнения (ниже вероятность зависимости по данным)

Superscalar pipeline

Thread 1 Thread 2

Разделение ресурсовALU, FPU, Load/Store

▪ Примеры реализации:

❑ 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

(8-way SMT)

Intel Hyper-Threading Technology

http://www.intel.ru/content/www/ru/ru/architecture-and-technology/hyper-threading/hyper-threading-technology.

html

Логический процессор

Architectural State

BackendВычислительное ядро (Execution

Engine)

Кеш-память (Cache)

Frontend (Fetch, Decode)

ILP

Chip

Логический процессор

Architectural State

▪ Architectural state + Interrupt controller = Logical processor

▪ 2 потока разделяют суперскалярный конвейер

▪ Ускорение (Speedup) ~ 30 %

▪ Architectural state = {

❑ Регистры общего назначения (RAX, RBX, RCX, …)

❑ Сегментные регистры (CS, DS, …),

❑ Управляющие регистры (RFLAGS, RIP, GDTR)

❑ X87 FPU-регистры, MMX/XMM/YMM-регистры

❑ MSR-регистры, Time stamp counter

}

Многопроцессорные SMP-системы

CPU 1

Cache

CPU 2

Cache

CPU N

Cache

I/O

Bus Arbiter

System bus

Shared memory (RAM)

▪ Процессоры SMP-системы имеют одинаковое время доступа к разделяемой памяти (симметричный доступ)

▪ Системная шина (System bus) – это узкое место, ограничивающее масштабируемость вычислительного узла

Многопроцессорные NUMA-системы (AMD)

▪ NUMA (Non-Uniform Memory Architecture) – это архитектура вычислительной системы с неоднородным доступом к разделяемой памяти

▪ Процессоры сгруппированы в NUMA-узлы со своей локальной памятью▪ Доступ к локальной памяти NUMA-узла занимает меньше времени по сравнению с временем доступом к памяти удаленных процессоров

Local access (fast)

Remote access (slow)

▪ 4-х процессорная NUMA-система▪ Каждый процессор имеет интегрированный контроллери несколько банков памяти

▪ Процессоры соединены шиной Hyper-Transport (системы на базе процессоров AMD)

▪ Доступ к удаленной памяти занимает больше времени (для Hyper-Transport ~ на 30%, 2006)

Многопроцессорные NUMA-системы (Intel)

▪ 4-х процессорная NUMA-система

▪ Каждый процессор имеет интегрированный контроллер и несколько банков памяти

▪ Процессоры соединены шиной Intel QuickPath Interconnect (QPI) – решения на базе процессоров Intel

Intel Nehalem based systems with QPI 2-way Xeon 5600 (Westmere) 6-core, 2 IOH

Memory Memory

CPU 0 CPU 1

Политика управления памяти NUMA-системы

▪ Политики управления памятью можно задавать в настройках 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)

Многоядерные процессоры (Multi-core processors)

Логический процессорArchitectural State

BackendВычислительное ядро

(Execution Engine)

Кэш-память (Cache)

Frontend (Fetch, Decode)

ILP

СhipЛогический процессорArchitectural State

BackendВычислительное ядро

(Execution Engine)

Кэш-память (Cache)

Frontend (Fetch, Decode)

ILP

TLP

▪ Процессорные ядра размещены на одном чипе (Processor chip)

▪ Ядра процессора могу разделять некоторые ресурсы (например, кэш-память)

▪ Многоядерный процессор реализует параллелизм уровня потоков (Thread level parallelism – TLP)

Core 0 Core 1

Многоядерные процессоры с поддержкой SMT

Логический процессор

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-поток как логический процессор

Многоядерные процессоры с поддержкой SMT

Логический процессор

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

Thread 0 Thread 1Thread Level Parallelism + Instruction Level Parallelism

▪ Операционная система видит 4 логических процессора▪ Потоки 0 и 1 выполняются на суперскалярных конвейерах разных ядер▪ Задействован параллелизм уровня потоков (TLP) и инструкций (ILP)

Смартфоны

Apple iPhone 5S

▪ Dual-core Apple A7 (CPU A7 + GPU M7)(CPU A7 1.3 GHz, 64-bit ARMv8-A)

▪ SIMD: 128-bit wide NEON

▪ L1 cache: per core 64 KB L1i, 64 KB L1d

▪ L2 cache: shared 1 MB

▪ L3 cache: 4 MB

▪ Technology process: 28 nm (manufactured by Samsung)

https://www.apple.com/ru/iphone-5s/specs/

Смартфоны

Samsung Galaxy S4 (GT-I9505)

▪ Quad-core Qualcomm 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

http://www.samsung.com/ru/business/business-products/mobile-devices/smartphone/GT-I9505ZRFSER

Специализированные ускорители: Intel Xeon Phi

▪ 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 логических

процессоров

Специализированные ускорители: Graphics Processing Unit

▪ 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)

Специализированные многоядерные процессоры

Sony Playstation 3IBM Cell (2-way SMT PowerPC core + 6 SPE)

Microsoft XBox 360IBM Xenon (3 cores with 2-way SMT)

Tilera TILEPro64(64 cores, VLIW, mesh)

Cisco RoutersMIPS Multi-core processors

Специализированные многоядерные процессоры

▪ Как (на чем) разрабатывать программы для такого количества многоядерных архитектур?

▪ Как быть с переносимостью кода программ между платформами?

▪ Как быть с переносимостью производительности программ?

▪ Все ли алгоритмы эффективно распараллеливаются?

Concurrency is the next major revolution in how we write software

-- Herb SutterHerb Sutter. The Free Lunch Is Over:

A Fundamental Turn Toward Concurrency in Software // http://www.gotw.ca/publications/concurrency-ddj.htm

Модель архитектуры ВС с общей памятью

Наивная модель ВС с общей памятью

Память

ЭП ЭП ЭП ЭП

Процессоры соединены непосредственно с памятью, все взаимодействия через чтение/запись из памяти

Предполагается, что модель согласованности памяти соответствует порядку операций в программе: записи и чтения происходят так, как это выполняется в программе

Наивная модель ВС с общей памятью

▪ процессоры выполняют процессы▪ процессы не синхронизованы▪ методы для синхронизации процессов▪ процессы обмениваются информацией через общую

память▪ методы для разделения памяти между процессами

Память

ЭП ЭП ЭП ЭП

Реальные архитектуры с общей памятью

Память

ЭП ЭП ЭПЭП

кэш

Кэш: небольшая, быстрая память, расположенная близко к процессору. Сохраняет из основной памяти блоки, которые затем используются при вычислениях.Буфер между процессором и основной памятью.

Реальные архитектуры с общей памятью

Память

ЭП ЭП ЭПЭП

кэш

Тип памяти Ёмкость Время доступа

Основная память гигабайты > 100 циклов

Кэш килобайты, мегабайты 1-20 циклов

Регистры 0-1 циклов

Многоуровневная система кэша

Память

ЭП ЭП ЭПЭП

кэш

кэш

Д И

Уровень 3

Уровень 2

Уровень 1

2-3 уровня + специализированные кэши, TLB, кэш инструкций и т.д.

NUMA-системы

Память

ЭП ЭП ЭПЭП

кэш

кэш

Д И

Уровень 3

Уровень 2

Уровень 1

Кэш решает проблему “узкого места”. При этом изменения в кэше могут реально применяться в произвольном порядке.

Память

Абстракция памяти

Однопроцессорная ЭВМ: система памяти и процессор позволяют обеспечить абстракцию памяти.

Память

ЭП ЭП ЭПЭП

кэш

кэш

Д И

Уровень 3

Уровень 2

Уровень 1

ПамятьП

ЭП

кэш

ВС с общей памятью: трудно обеспечить абстракцию единой однородной памяти.

Абстракция памяти - проблемы

Память

ЭП ЭП ЭПЭП

кэш

кэш

Д И

Уровень 3

Уровень 2

Уровень 1

Память

▪ Что случится, если один и тот же адрес находится в разных кэшах?

▪ Что происходит при изменении записи в один из кэшей одним из процессоров?

▪ Несколько процессоров записывают или читают из одного адреса?

Абстракция памяти - проблемы

ЭП ЭП ЭПЭП

кэш

Д И

Память

Д И Д И Д И

кэш

Абстракция памяти - проблемы

Память

ЭП ЭП ЭПЭП

кэш

кэш

Д И

Уровень 3

Уровень 2

Уровень 1

Память

▪ Что случится, если один и тот же адрес находится в разных кэшах?

▪ Что происходит при изменении записи в один из кэшей одним из процессоров?

▪ Несколько процессоров записывают или читают из одного адреса?

Проблема когерентности кэша

Процессы и потоки

Процессы и потоки операционной системы

Инструкции(Instructions)

Инициализированные данные (Initialized data)

ELF/PE executable file

Исполняемый файл (Image) на носителе информации

Memory (RAM)

Инструкции(Instructions)

Инициализированные данные (Initialized data)

Неинициализированные данные (Uninitialized data)

Куча (Heap, Virtual Memory)

Данные библиотек (Library data)

Инструкции библиотек

(Library instructions)

Stack

Registers

Поток 0(Thread 0)

▪ Процесс (Process) – запущенный исполняемый файл (образ, image)

▪ После запуска процесс владеет одним потоком выполнения (thread)

Многопоточный процесс

Memory (RAM)

Инструкции(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)

▪ Поток (тред, нить) - независимый поток инструкций, выполнение которых планируется ОС.

▪ Поток - наименьшая единица, которую можно планировать независимо.

Многопоточный процесс

Memory (RAM)

Инструкции(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) – память для хранения значения архитектурных регистров при переключении контекстов (context switching) операционной системой

▪ Куча процесса (heap), инструкции, статические данные (инициализированные) являются общими для всех потоков

Concurrency ≠ Parallelism

18 февраля 2014 г.

▪ Concurrency (одновременность) – два и более потоков выполняются разделяя одно процессорное ядро

▪ Операционная система реализует режим разделения времени ядра процессора (time sharing)

▪ Ускорение вычислений отсутствует

▪ Зачем?

▪ Обеспечение отзывчивости интерфейса, совмещение ввода-вывода и вычислений, ...

▪ Parallelism (параллелизм) – каждый поток выполняется на отдельном ядре процессора (нет конкуренции за вычислительные ресурсы)

▪ Вычисления выполняются быстрее

Concurrency ≠ Parallelism

Суперскалярный процессор

Мультипроцессор Hyperthreading

Обзор библиотеки POSIX Threads

POSIX Threads (Pthreads)

▪ Pthreads - интерфейс для потоков семейства стандартов POSIX

▫ в основе - системные вызовы для создания и синхронизации потоков

▫ поддерживаются UNIX-подобные операционные системы

▫ IEEE POSIX 1003.1c

▪ Pthreads поддерживает:

▫ реализация параллелизма

▫ синхронизация потоков

▫ нет явной поддержки коммуникаций между потоками: поскольку общая память неявная, а указатель на общие данные передаётся в поток

POSIX Threads (Pthreads)

Сигнатура: 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, если операция завершилась неудачно

Pthreads - пример 1

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); }}

Pthreads - пример 2 (передача арумегнтов в поток)

struct bounds { int threadnum; int begin; int end;};

enum { nthreads = 4 };

void *func(void *arg){ struct bounds *mybounds; mybounds = (struct bounds *) arg;

printf("hello, i am %d thread, my bounds: %d and %d\n", mybounds->threadnum, mybounds->begin, mybounds->end);

pthread_exit(NULL);}

Pthreads - пример 2 (передача арумегнтов в поток)

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; }

Pthread-функции

▪ pthread_join(pthread_t *thread, void *result);- дождаться завершения выполнения потока, результирующее значение поместить в *result

▪ pthread_yield();- сообщить планировщику, что поток собирается “уступить” свой квант времени

▪ pthread_exit(void *value);- выйти из потока и передать значение потоку, в котором данный поток был вызван

▪ pthread_self();- позволяет потоку получить свой собственный идентификатор pthread_t

▪ pthread_detach(thread)- для завершения данного потока больше не требуется вызов функции pthread_join

Планирование потоков

главный тред

тред А тред B

тред D тред С

тред E

время

▪ когда после создания тред должен запускаться▫ планирование в ОС не позволяет учитывать данное конкретное приложение

и число тредов в нём▪ программист может “помогать” планированию

▫ создать N потоков и назначить их на N процессорных ядер▪ можно настроить пользовательское планирование потоков для данной

программы


Recommended