Каковы характеристики истощения RDRAND на мосту Айви?
После просмотра Руководство по внедрению программного обеспечения для цифровых генераторов цифровых данных (DRNG), у меня есть несколько вопросов о том, что происходит с внутренним состоянием генератора при вызове RDRAND
. К сожалению, ответы, похоже, не содержатся в руководстве.
-
В соответствии с руководством внутри DRNG есть четыре 128-битных буфера, которые служат для случайных бит для RDRAND
для слива. RDRAND
сам будет предоставлять 16, 32 или 64 бит случайных данных в зависимости от ширины регистра назначения:
rdrand ax ; put 16 random bits in ax
rdrand eax ; put 32 random bits in eax
rdrand rax ; put 64 random bits in rax
Будет ли использование более крупных регистров назначения сбросить эти 128-битные буферы быстрее? Например, если мне нужно всего 2 бита случайности, я должен решить проблему использования 16-битного регистра в 64-битном регистре? Разве это повлияет на пропускную способность DRNG? Я хотел бы избежать потребления большего количества случайности, чем это необходимо.
-
В руководстве говорится, что флаг переноса будет установлен после выполнения RDRAND
:
CF = 1 Destination register valid. Non-zero random value
available at time of execution. Result placed in register.
CF = 0 Destination register all zeros. Random value not available
at time of execution. May be retried.
Что означает "недоступно"? Могут ли случайные данные быть недоступными, потому что RDRAND
invocations слишком быстро исчерпали эти 128-битные буферы? Или недоступно означает, что DRNG не выполняет свои проверки работоспособности и не может генерировать новые данные? В принципе, я пытаюсь понять, может ли CF = 0 произойти только потому, что буферы случаются (временно) пустые, когда вызывается RDRAND
.
Примечание. Я рассмотрел ответы на этот вопрос о пропускной способности и задержке RDRAND, но я искать другую информацию.
Спасибо!
Ответы
Ответ 1
Часть 1.
Имеет ли значение размывание 16, 32 или 64 бит?
Нет.
На мосту Ivy мосты CPU вытаскивают 64 бита по внутренним каналам связи с DRNG, независимо от размера регистра назначения. Поэтому, если вы читаете 32 бита, он вытаскивает 64 бита и выбрасывает верхнюю половину. Если вы читаете 16 бит, он вытаскивает 64 и выбрасывает верхнюю часть 3/4.
Это не описано в документации по инструкции, потому что оно может не оставаться верным в будущих продуктах. Чип может быть спроектирован, который фиксирует и использует неиспользуемые части 64-битного слова. Однако для этого сегодня не требуется значительная производительность.
Для максимальной пропускной способности наиболее эффективной стратегией является переход от параллельных потоков. Это связано с тем, что в иерархии шины на чипе есть parallelism. Большую часть времени для обучения - это время транзита через автобусы. Выполнение этого транзита параллельно приведет к линейному увеличению пропускной способности с количеством потоков, вплоть до 800 Мбайт/с. Во-вторых, нужно использовать 64-битные RdRands, потому что они получают больше данных за инструкцию.
Часть 2.
Что означает CF = 0 на самом деле?
Это означает, что "случайные данные недоступны". Это связано с тем, что детали того, почему он не может получить номер, недоступны для ядра ЦП без его ухода и чтения большего количества регистров, чего он не собирается делать, потому что он ничего не может сделать с информацией.
Если вы высушили выходной буфер DRNG сухой, вы получите нижний поток (CF = 0), но вы можете ожидать, что следующий RdRand преуспеет, потому что DRNG работает быстро.
Если DRNG не удался (например, транзистор появился в источнике энтропии, и он больше не был случайным), то онлайн-тесты здоровья обнаружат это и выключат DRNG. Тогда все ваши вызовы RdRand дадут CF = 0.
Однако на Ivy Bridge вы не сможете переполнить буфер. DRNG немного быстрее, чем автобус, к которому он прикреплен. Эффект вытягивания большего количества данных за единицу времени (с параллельными потоками) будет заключаться в увеличении времени выполнения каждого отдельного RdRand, поскольку конкуренция на шине заставляет команды ждать в очереди на локальной шине DRNG. Вы никогда не сможете так быстро вытащить DRNG. Вы будете асимптотически достигать 800 Мбайт/с.
Это также не описано в документации, потому что это может не соответствовать истине в будущих продуктах. Мы можем предусмотреть продукты, в которых автобусы работают быстрее, а ядра быстрее, и DRNG может быть истощен. Эти вещи еще не известны, поэтому мы не можем заявлять о них.
Что останется верным, так это то, что основной цикл (попробуйте до 10 раз, а затем сообщите о сбое в стеке), приведенный в руководстве по внедрению программного обеспечения, будет продолжать работать в будущих продуктах, потому что мы заявили, что он будет и поэтому мы будем разрабатывать все будущие продукты для удовлетворения этого.
Таким образом, нет, CF = 0 не может произойти, потому что "буферы будут (временно) пустыми, когда RDRAND вызывается" на мосту Ivy Bridge, но это может произойти на будущем кремнии, поэтому создайте ваше программное обеспечение для справки ".
Ответ 2
Не читайте ничего в FIFO 4 * 128 бит на выходе DRNG. Это, безусловно, есть (я выразился там), но это не то, что имеет видимый эффект программного обеспечения. Логика DRNG не дает данных плавно. Это когда-то планирует другие вещи, такие как пересадка или кондиционирование, согласно спецификации SP800-90. Таким образом, поток данных под нагрузкой является нерегулярным.
Буферная длина 4 была выбрана потому, что при 800 Мбайт/с (скорость локально подключенной шины) 4 достаточно глубока, чтобы предотвратить переполнение при достижении максимальной скорости, учитывая наихудший график планирования, поэтому существует постоянная, плавное питание 800 Мбайт/с без прерывания вывода.
Если подключенная шина была медленнее, буфер был бы короче, потому что более короткий буфер был бы достаточным для предотвращения переполнения.
Ответ 3
Относительно 2:
http://download.intel.com/products/processor/manual/253665.pdf, 7.3.17
CF указывает, что спрос на случайные данные превышает пропускную способность DRNG.
Относительно 1:
Если вы беспокоитесь о производительности, почему бы не прочитать 64-битное случайное значение из DRNG, тогда вы можете прочитать 2 бита из этого 32 раза, прежде чем вам нужно снова вызвать инструкцию.
Вам не нужно вызывать новый rdrand каждый раз, когда вам нужно биты.