2012-05-07 5 views
27

Не удается найти информацию о agner.org о задержке или пропускной способности инструкции RDRAND. Однако этот процессор существует, поэтому информация должна быть там.Что такое латентность и пропускная способность инструкции RDRAND на Ivy Bridge?

Редактировать: На самом деле в новейшей инструкции по оптимизации упоминается эта инструкция. Он задокументирован как < 200 циклов, а общая пропускная способность не менее 500 Мбайт/с на Ivy Bridge. Но некоторые более глубокие статистические данные по этой инструкции были бы замечательными, поскольку латентность и пропускная способность являются переменными.

+0

Я не знаю ответа, не имея контрольного показателя, но, как заинтересованная сторона, могу спросить: «Как быстро вы хотите, чтобы это было?» То есть в каких приложениях нужно много RDRAND? Кстати, здесь есть два разных вопроса: (а) насколько быстро инструкция с точки зрения латентности и пропускной способности, но также (б) может ли она быть прочитана быстрее, чем накопится энтропийный пул? То есть вы можете исчерпать энтропийный пул и просто бежать от псевдослучайных чисел? –

+2

Единственная причина, по которой я могу думать о том, почему кто-то будет заботиться, - это решить, следует ли использовать «RDRAND» напрямую или через PRNG. В обоих случаях вы получите такое же наблюдаемое поведение, но одно может быть значительно быстрее, чем другое, и не сразу видно, какой из них будет. (KrazyGlew: Ваш 'b' не имеет значения. Это похоже на вопрос, сколько воды вы получите до того, как оно переключится на воду. Между ними нет различимой разницы, и в этом контексте различие по существу не имеет смысла.) –

+0

@KrazyGlew Пример использования - генерация случайных чисел для статистической выборки на графическом процессоре. – user239558

ответ

28

Я написал librdrand. Это очень простой набор процедур для использования команды RdRand для заполнения буферов случайными числами.

Данные о производительности, которые мы показали в IDF, из тестового программного обеспечения, которое я написал, порождают ряд потоков, использующих pthreads в Linux. Каждый поток потянет заполняет буфер памяти случайными числами, используя RdRand. Программа измеряет среднюю скорость и может выполнять итерацию при изменении количества потоков.

Поскольку время задержки связи между каналами связи с общим ядром до общего DRNG и обратно больше, чем время, необходимое для генерации случайного числа в DRNG, средняя продолжительность работы, очевидно, увеличивается при добавлении потоков, вплоть до достигается максимальная пропускная способность. Физическая максимальная пропускная способность DRNG на IVB составляет 800 Мбайт/с. 4-жильный IVB с 8 потоками управляет чем-то размером 780 Мбайт/с. При меньшем числе нитей и сердечников достигается меньшее число. Число 500 Мбайт/с несколько консервативно, но когда вы пытаетесь сделать честные заявления о производительности, вы должны быть.

Поскольку DRNG работает на фиксированной частоте (800 МГц), в то время как частоты ядра могут меняться, количество тактовых циклов ядра на RdR и изменяется в зависимости от частоты ядра и количества других ядер, одновременно обращающихся к DRNG. Кривые, представленные в презентации IDF, представляют собой реалистичное представление о том, чего ожидать. Общая производительность немного зависит от частоты ядра, но не так много. Количество потоков - это то, что доминирует.

Нужно быть осторожным при измерении производительности RdRand, чтобы фактически использовать результат RdRand. Если вы этого не сделаете, И.Е. вы сделали это. RdRand R6, RdRand R6, ....., RdRand R6 повторяется много раз, производительность будет считаться искусственно высокой. Поскольку данные не используются до того, как они будут перезаписаны, конвейер ЦП не дожидается возвращения данных из DRNG до того, как он выдает следующую инструкцию. Те тесты, которые мы написали, записывают полученные данные в память, которые будут в кэше на кристалле, поэтому конвейер ждет ожидания данных. Именно поэтому hyperthreading гораздо эффективнее с RdRand, чем с другими типами кода.

Сведения о конкретной платформе, тактовой частоте, версии Linux и версии GCC приведены в слайдах IDF.Я не помню цифры с головы. Доступны чипы, которые медленнее, а чипы доступны быстрее. Число, которое мы дали для < 200 циклов на инструкцию, основано на измерениях около 150 основных циклов на инструкцию.

Чипы доступны сейчас, поэтому любой, кто хорошо разбирается в использовании rdtsc, может выполнять те же тесты.

+4

Пожалуйста, добавьте ссылку на презентацию IDF. – Nathan

+3

«Я написал librdrand», - сказал он. – JebaDaHut

+0

Итак, 'rdrand' похож на нагрузку с высокой задержкой? Числа Agner Fog указывают пропускную способность одного на ~ 110 с на IvB или один на ~ 460 циклов на Skylake. Мне любопытно, сколько вычислений может пересекаться с 'rdrand', так как большинство кодов, которые используют случайные числа, на самом деле имеют много работы, кроме генерации случайных чисел.Поэтому мне любопытно, как сильно это замедлит некоторый реальный код, чтобы использовать «RDRAND» вместо сверхбыстрого PRNG, такого как xorshift, или даже против самого быстрого генератора случайных чисел: 'xor eax, eax'. –

7

Вы найдете соответствующую информацию по адресу Intel Digital Random Number Generator (DRNG) Software Implementation Guide.

Дословная цитата следующим образом:

Измеренных Пропускная способность:

Up to 70 million RDRAND invocations per second 
500+ million bytes of random data per second 
Throughput ceiling is insensitive to the number of contending parallel threads 
+0

+1: очень хорошая ссылка – Necrolis

+0

@ user434507 - Всегда полезно включить соответствующий бит. Эта связь может сломаться, и этот ответ станет бессмысленным. Я сделал это для вас на этот раз :) – ArjunShankar

+0

Цитата: «Это приводит к дистилляции энтропии в более концентрированные образцы». Удивительно, не так ли? –

3

я сделал некоторые предварительные тесты пропускной способности на фактическом Ivy Bridge i7-3770 с помощью Intel, "librdrand" обертку и генерирует 33 -35 миллионов 32-разрядных номеров в секунду на одном ядре.

Этот номер 70M от Intel составляет около 8 ядер; для одного они сообщают только о 10 М, поэтому мой тест превышает 3 раза лучше: -/

+0

Вы на самом деле использовали результат? Ответ Дэвида гласит, что CPU отбрасывает неполные 'rdrand' uops, если реестр результатов просто перезаписан. (Так, например, хранить в памяти или «XOR» во что-то.) –

3

Вот некоторые показатели производительности я получаю с rdrand: http://smackerelofopinion.blogspot.co.uk/2012/10/intel-rdrand-instruction-revisited.html

На i5-3210M (2,5 ГГц) Ivybridge (2 ядра, 4 потока) Я получить пик ~ 99,6 млн 64 бит в секунду rdrands с 4, что соответствует ~ 6,374 миллиарда бит в секунду.

8-дюймовый i7-3770 (3,4 ГГц) Ivybridge (4 ядра, 8 потоков). Я поразил максимальную пропускную способность 99,6 млн. 64-битных rdrands в секунду на 3 потоках.

+0

Как вы вызываете 'stress-ng' для получения номеров пропускной способности? Лучшее, что я смог сделать, это «стресс-ng -rdrand 1 -metrics -t 60», но метрики (например, BogoMIPS) мне не очень полезны. – jww

+0

Попробуйте: https://github.com/ColinIanKing/x86rdrand-benchmark –