Я написал 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, может выполнять те же тесты.
Я не знаю ответа, не имея контрольного показателя, но, как заинтересованная сторона, могу спросить: «Как быстро вы хотите, чтобы это было?» То есть в каких приложениях нужно много RDRAND? Кстати, здесь есть два разных вопроса: (а) насколько быстро инструкция с точки зрения латентности и пропускной способности, но также (б) может ли она быть прочитана быстрее, чем накопится энтропийный пул? То есть вы можете исчерпать энтропийный пул и просто бежать от псевдослучайных чисел? –
Единственная причина, по которой я могу думать о том, почему кто-то будет заботиться, - это решить, следует ли использовать «RDRAND» напрямую или через PRNG. В обоих случаях вы получите такое же наблюдаемое поведение, но одно может быть значительно быстрее, чем другое, и не сразу видно, какой из них будет. (KrazyGlew: Ваш 'b' не имеет значения. Это похоже на вопрос, сколько воды вы получите до того, как оно переключится на воду. Между ними нет различимой разницы, и в этом контексте различие по существу не имеет смысла.) –
@KrazyGlew Пример использования - генерация случайных чисел для статистической выборки на графическом процессоре. – user239558