Поднимает ли исключительная инструкция по загрузке и хранению руку тупик? - PullRequest
0 голосов
/ 09 января 2019

Простой Spin Lock вызывает тупик, вызванный исключительной инструкцией доступа к памяти?

У меня есть представление о том, что LDXR / STXR происходит тупик. Возможен ли этот случай?

Двухъядерная глобальная переменная доступа в несколько разностей тактов команд И повтори. На обоих ядрах работает один и тот же код.

Моя эксклюзивная простая сборка Spin Lock (Изображение):

.spin_lock:
    NOP
.stxr_fail:
    LDXR  R0, .data+0
    CMP   R0, #0
    BNE    .spin_lock
    MOV  R0, #1
    STXR  W0, R0, .data+0
    CMP   W0, #0
    BNE   .stxr_fail
    BL       critical_section()
    MOV  R0, #0
    STR     R0, .data+0
    RET 

.data:
    .word lock

image1

Возникает ли тупик при многоядерности? (Изображение):

image2

Каждая строка одного цвета является атомным шагом. Это работает последовательно в числовом шаге. Это произошло в тупике на 6 ~ 11 шагов.

Если я неправильно понял, пожалуйста, объясните

1 Ответ

0 голосов
/ 11 января 2019

Да, извините, я исправляюсь ....

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

.spin_lock:
    NOP
.stxr_fail:
    LDXR  R0, .data+0
    CMP   R0, #0
    BNE    .spin_lock

Если не ноль, то вы получите

load exclusive
store exclusive
check if the store worked.
repeat the whole thing if not.

Если бы два мастера А и В идеально выстроились в линию

loadx a
loadx b
storex a
storex b

Между эксклюзивным чтением и эксклюзивным письмом могут быть другие Неэксклюзивные переводы.

...

Если ни один другой мастер не написал в это место со времен Эксклюзива Чтение передачи, передача Эксклюзивная запись успешно и обновления объем памяти.

...

Если другой мастер написал в это место после Эксклюзива Передача чтения, передача исключительной записи не удалась и память местоположение не обновлено.

storex от мастера a завершится успешно, storex от мастера b выйдет из строя, поэтому мастер a выйдет из цикла. master b будет продолжать цикл до тех пор, пока нагрузка не вернется ненулевой.

Так что он не может зайти в тупик даже на немного.

Мне нужно прочитать еще кое-что (ну, вы должны это сделать, поскольку это находится в документации ARM, где лежит ваш ответ, здесь не используется stackoverflow, чтобы прочитать документацию для вас, которая лежит в основе этого вопроса), чтобы подтвердить, что loadx a, loadx b, storex a будет иметь действительный магазин. Из приведенных выше цитат это было бы так. Если нет, то вы окажетесь в ситуации, когда ни один из них не получит блокировку до тех пор, пока один из них не будет прерван или по какой-либо другой причине не изменит свою частоту ударов, возможно, позволяя другому мастеру получить эксклюзивное хранилище чистой нагрузки. например, может ли логика просто запомнить идентификатор последнего ldrex и сравнить его со следующим strex

Монитор эксклюзивного доступа должен быть способен одновременно мониторинг как минимум одного адреса для каждого эксклюзивного доступа способный мастер в системе.

...

Раб, который не поддерживает монопольный доступ, может игнорировать AxLOCK сигналы. Он должен предоставить OKAY ответ как для нормального, так и для эксклюзивные доступы. Раб, поддерживающий монопольный доступ, должен иметь Мониторинг оборудования. Эта спецификация рекомендует, чтобы такой раб имел блок монитора для каждого основного идентификатора с исключительными возможностями, который может получить доступ Это. Справочное руководство по архитектуре ARM, редакция ARMv7-A и ARMv7-R определяет монитор монопольного доступа, а однопортовый подчиненный иметь такой эксклюзивный монитор доступа, внешний по отношению к ведомому. Многопортовый ведомый может потребовать внутреннего контроля.

Это означает, что если подчиненный поддерживает монопольный доступ, он должен иметь монитор (должен хранить идентификатор из предыдущего ldrex и сравнивать его с текущим strex). но рекомендуется только иметь монитор на мастер, так что если у него нет монитора на мастер, то вы, скорее всего, окажетесь в такой ситуации

ldrex a, ldrex b, strex a, strex b. Ldrex b и strex a не совпадают, поэтому сохранение не происходит, теперь в этом случае ldrex b и strex b совпадают, поэтому мы можем предположить, что master b получает блокировку, и мастер цикла a должен ждать, пока master b не обнулит ячейка памяти (clrex или, возможно, простая строка).

Arm имеет спецификации шины Axi и AHB, а также различные редакции этих спецификаций, и какой из них соответствует тому, какое ядро, возможно, содержится в техническом справочном руководстве для этого ядра. И чтобы получить полный ответ, вы должны, по крайней мере, попытаться сопоставить их и прочитать правильную спецификацию ревизии для используемого ядра и не предполагать, что все они в точности совпадают. Также следует понимать, что кэш L1 является частью ядра arm, кэш l2 находится за пределами ядра, но вы можете купить l2 у руки (или сделать свой собственный), можно надеяться, что логика ARM поддерживает эксклюзивный доступ, как описано в документации. Кроме того, вы попадаете на территорию производителей микросхем, и они могут реализовать то, что они хотят нарушить или нет, чтобы по-настоящему разделить, можно было бы хотеть, чтобы эти доступы находились в общем пространстве памяти, совместно используемом различными ядрами, и не имели кеш-ответов L1 или L2 и есть проблема согласованности. Производитель чипа может отказаться от эксклюзивного доступа и вернется в порядке. То, как это выглядит в коде, это то, что оно будет вращаться вечно, «возвращаемое значение» из strex передает EXOKAY только в том случае, если оно никогда не возвращается, поскольку проект не поддерживает монопольный доступ, тогда цикл бесконечен. Был там, видел это, вот как я знаю. В более старом документе говорилось, что для однопроцессорных разработок не требуется поддержка эксклюзивного доступа, в текущих версиях спецификаций не говорится, что они просто говорят вещи, связанные с тем, поддерживает ли подчиненный или нет эксклюзивный доступ.

если блокировка ldrex / strex будет работать, вы должны работать против ведомого, который поддерживает эксклюзивный доступ, в этом случае у вас есть один монитор или монитор на ведущее устройство, и я считаю, что я показал худшие случаи выше, если вы получить действительно очень везучий ldrex a, ldrex b, strex a, strex b для двух мастеров a и b, и на первом проходе нужно победить. а другой застревает в ожидании, как хотелось / задумано. добавьте больше мастеров и смешайте нагрузки и хранилища из них, и вы в конечном итоге окажетесь в той же ситуации: один выиграет, остальные проиграют и перейдут в цикл с нулевым циклом. Теперь интересно, если у вас есть два или более из них в этом цикле, тогда, когда один мастер, имеющий блокировку, освобождает его, вам не нужно быть везучим для других, борющихся за блокировку, чтобы получить ситуацию хранилища загрузки и загрузки.

...