Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Системная архитектура часть 4..doc
Скачиваний:
45
Добавлен:
16.04.2013
Размер:
751 Кб
Скачать

4.4.7. Атрибуты последовательности и упорядочивание

Упорядочивание памяти описано в разделе первого тома 4.4.7 «Упорядочивание обращений к памяти». Этот раздел описывает дополнительные правила упорядочивания для не кэшируемой памяти, операций синхронизации кэша (sync.i) и глобального сброса TLB (ptc.g, ptc.ga).

Как описано в разделе 4.4.7 первого тома, зависимости чтение после записи (RAW), запись после записи (WAW) и запись после чтения (WAR) для одного и того же места памяти (зависимости по памяти) выполняются процессором в порядке программы 1 . В противном случае, все другие обращения к памяти не могут быть выполнены в произвольном порядке, если обращение не является определенно помеченным как упорядоченное. Обращения к IA-32 памяти следуют за более сильной процессорной совместимой моделью памяти. О деталях упорядочивания IA-32 памяти см. раздел 10.6.10 «Упорядочивание IA-32 памяти». Явное упорядочивание делается в форме набора Itanium инструкций: упорядоченные загрузка и проверка загрузки (ld.acq, ld.c.clr.acq), упорядоченные сохранение (st.rel), семафоры (cmpxchg, xchg, fetchadd), забор памяти (mf), синхронизация (sync.i) и глобальный сброс TLB (ptc.g, ptc.ga). Инструкция sync.i используется для обслуживания упорядоченных отношений между кэшами инструкций и данных в локальных и удаленных процессорах. Инструкции глобального сброса TLB обслуживают мультипроцессорную когерентность TLB.

Табл. 4.14 описывает набор инструкций, для которых допустимо упорядочивание, он состоит из четырех семантик упорядочивания: без упорядочивания, освобождение, запрос или забор. Таблица описывает семантики упорядочивания и инструкции для каждой категории. Только эти Itanium инструкции могут быть использованы для установки соотношений мультипроцессорного упорядочивания.

В следующем обсуждении термины «предыдущий» и «последующий» используются по отношению к порядку, указанному программой. Термин «видимый» используются по отношению ко всем архитектурно видимым эффектам выполнения инструкции. Для доступов к памяти и семафоров, это включает, по крайней мере, чтение и запись памяти. Для mf.a, видимость определяется платформным принятием предыдущих доступов к памяти. Видимость sync.i, определяется видимостью предыдущих операций сливания кэша (fc). Для просмотров ALAT (ld.c, chk.a), видимость определяется попаданием или промахом ALAT. Для операций глобального сброса TLB, видимость определяется удалением трансляции адреса из таблиц TLB всех процессоров в когерентном домене TLB. Инструкции глобального сброса TLB (ptc.g и ptc.ga) следуют за семантикой освобождения и в локальном, и в удаленном процессоре.

Табл. 4.14. Семантики упорядочивания и инструкции

Семантики упорядочивания

Описание

Инструкции, доступные для упорядочивания

Без упорядочивания

Не упорядоченные инструкции могут стать видимыми в любом порядке.

ld, ld.s, ld.a, ld.sa, ld.fill, ldf, ldf.s, ldf.sa, ldf.fill, ld.fp, ldfp.s, ldfp.sa,

st, st.spill, stf, stf.spill,

mf.a, sync.i, ld.c, chk.a

Освобождение

Инструкции освобождения гарантируют, что все предыдущие инструкции, доступные для упорядочивания, сделаются видимыми до того, как станут видимыми они сами.

cmpxchg.rel, fetchadd.rel, st.rel, ptc.g, ptc.ga

Запрос

Инструкции освобождения гарантируют, что они сделаются видимыми раньше всех последующих доступных для упорядочивания инструкций.

cmpxchg.icq, fetchadd.icq, xchg, ld.acq, ld.c.clr.acq

Забор

Инструкции забора объединяют семантики освобождения и запроса в двунаправленный забор; т.е. они гарантируют, что все предыдущие доступные для упорядочивания инструкции, сделаются видимыми до того, как станет видимой любая последующая, доступная для упорядочивания инструкция.

mf

Доступы к памяти Itanium для последовательных страниц, происходят в программном порядке относительно всех других последовательных страниц в том же самом периферийном домене, но не обязательно упорядочены относительно не последовательных страничных доступов. Периферийный домен является платформо зависимой совокупностью некэшируемых доступов. Устройство ввода/вывода обычно содержится в периферийном домене и все последовательные доступы от одного процессора к этому устройству, будут упорядочены относительно друг друга. Последовательность гарантирует, что обращения к не кэшируемой и не объединенной памяти от одного процессора к периферийному домену, достигают этого домена в программном порядке. Последовательность не подразумевает видимость.

Сообщения межпроцессорных прерываний (IPI – Inter-Processor Interrupt) (8-байтовые сохранения по адресу блока процессорного прерывания, через UC атрибут памяти) являются исключениями для последовательных семантик. Сообщения IPI не упорядочены по отношению к другим IPI, направляемым на тот же самый процессор. Далее, операции забора не требуют упорядочивания между двумя IPI. См. раздел 5.8.4.2 «Прерывание и упорядочивание IPI».

Табл. 4.15 описывает, для последовательных и не последовательных операций, упорядочивание между не упорядоченными операциями, операциями освобождения, запроса и типа забор. Табл. 4.15 описывает минимальные требования к упорядочиванию; реализация может предписывать более жесткое упорядочивание, чем требуется архитектурой. Фактический механизм для принудительного упорядочивания доступа к памяти является зависимым от реализации.

Табл. 4.15. Семантики упорядочивания

Первая операция

Вторая операция

Забор

Не последовательная

ПоследовательнаяA

Запрос

Освобож.

Не упоряд.

Запрос

Освобож.

Не упоряд.

Забор

О

О

О

О

О

О

О

Не последо­вательная

Запрос

О

О

О

О

О

О

О

Освобож.

О

О

O

Не упоряд.

О

О

O

Последова­тельнаяA

Запрос

О

О

О

О

OS

OS

OS

Освобож.

О

О

S

OS

S

Не упоряд.

О

ОB

C

SD

OSE

S

  1. Исключая IPI.

  2. «О» указывает, что первая и вторая операции становятся видимыми в порядке программы.

  3. Черточка указывает, что не подразумевается никакого упорядочивания.

  4. «S» указывает, что первая и вторая операции достигают периферийного домена в программном порядке.

  5. «OS» подразумевает, что применяются оба отношения упорядоченности и «О», и «S».

Табл. 4.15 устанавливает порядок между операциями в отдельном процессоре. Для операций в кэшируемой памяти с отложенной записью, порядок, установленный этими правилами, наблюдается всеми наблюдателями в когерентном домене.

Например, когда в процессоре выполняется эта последовательность:

st [a]

st.rel [b]

а второй процессор выполняет эту последовательность:

ld.acq [b]

ld [a]

то если второй процессор наблюдает сохранение [b], то он будет также наблюдать сохранение [a].

Если ограничение упорядочивания из табл. 4.15, не предотвращает чтения памяти2, становящееся видимым, то чтение может быть удовлетворено значениями, найденными в буфере сохранения (или любой эквивалентной логической структуры). Эти значения не должны быть глобально видимыми, даже когда операцией, которая создает значение, была st.rel. Эта локальная блокировка поведения может делать доступы различных размеров, но с накладывающимися обращениями к памяти, появляющимися для завершения не атомарности. Чтобы гарантировать, что запись в память является глобально наблюдаемой до чтения памяти, программа должна разместить между двумя операциями, явную операцию забора.

Выровненным операциям st.rel и семафорным операциям3, от множества процессоров в кэшируемую память с отложенной записью, становятся видимыми для всех наблюдателей в одном общем порядке (т.е. в частном чередовании; если он становится видимым любому наблюдателю, то он является видимым для всех наблюдателей), за исключением того, что для st.rel, каждый процессор может наблюдать (через ld или ld.acq) свою собственную модификацию до того, как она станет наблюдаемой глобально.

Архитектура Itanium гарантирует, что этот единый общий порядок только для выровненных st.rel и семафорных операций в кэшируемую память с отложенной записью. Другие операции памяти4 для множества процессоров, не требуются, чтобы стать видимыми в любом специальном порядке, если они не ограничивают друг друга правилами упорядочивания определенными в табл. 4.15.

Упорядочивание загрузок далее ограничено зависимостью по данным. Т.е. если одна загрузка читает значение, записанное более ранней загрузкой, причем тем же самым процессором (прямо или косвенно, через регистры или память), то обе загрузки станут видимыми в программном порядке.

Например, когда эта последовательность выполняется в процессоре:

st [a] = данные

st.rel [b] = a

а второй процессор выполняет эту последовательность:

ld x = [b]

ld y = [x]

то если второй процессор наблюдает сохранение [b], то он будет также наблюдать сохранение [a].

Также, например, когда эта последовательность выполняется в процессоре:

st [a]

st.rel [b] = ‘new’

а второй процессор выполняет эту последовательность:

ld x = [b]

cmp.eq.pl = x, ‘new’

(p1) ld y = [a]

то если второй процессор наблюдает сохранение [b], то он будет также наблюдать сохранение [a].

И, например, когда эта последовательность выполняется в процессоре:

st [a]

st.rel [b] = ‘new’

а второй процессор выполняет эту последовательность:

ld x = [b]

cmp.eq.pl = x, ‘new’

(p1) br target

. . .

target:

ld y = [a]

то если второй процессор наблюдает сохранение [b], то он будет также наблюдать сохранение [a].

Инструкция сливания кэша (fc) следует за упорядочиванием зависимым от данных. Инструкция fc упорядочивается относительно предыдущих и последующих инструкций загрузки сохранения и семафорных инструкций, для той же самой строки, не зависимо от заданного атрибута памяти. Инструкция fc не упорядочивается относительно операций памяти для различных строк. Инструкция mf не гарантирует видимости операций fc. Вместо этого инструкция sync.i синхронизирует инструкции fc, а sync.i делается видимой использованием инструкции mf.