Ответ 1
Я написал 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, может сделать такой же тест.