Какова задержка и пропускная способность инструкции RDRAND на Ivy Bridge?
Я не могу найти никакой информации на agner.org о задержке или пропускной способности инструкции RDRAND. Однако этот процессор существует, поэтому информация должна быть там.
Изменить: На самом деле новейшее руководство по оптимизации упоминает эту инструкцию. Это задокументировано как <200 циклов, а общая пропускная способность не менее 500 МБ / с на Ivy Bridge. Но некоторые подробные статистические данные по этой инструкции были бы хорошими, поскольку задержка и пропускная способность являются переменными.
4 ответа
Я написал Либрдранд. Это очень простой набор процедур для использования инструкции RdRand для заполнения буферов случайными числами.
Данные о производительности, которые мы показали в IDF, взяты из написанного мной тестового программного обеспечения, которое порождает множество потоков с использованием pthreads в Linux. Каждый потянувший поток заполняет буфер памяти случайными числами, используя RdRand. Программа измеряет среднюю скорость и может выполнять итерации, изменяя количество потоков.
Поскольку существует задержка передачи данных в обоих направлениях от каждого ядра к совместно используемому DRNG и обратно, которая больше времени, необходимого для генерации случайного числа в DRNG, средняя производительность, очевидно, увеличивается при добавлении потоков до тех пор, пока не будет достигнута максимальная пропускная способность., Физическая максимальная пропускная способность DRNG на IVB составляет 800 МБ / с. 4-ядерный IVB с 8 потоками управляет чем-то порядка 780 Мбайт / с. Чем меньше потоков и ядер, тем меньше число. Число 500 МБ / с несколько консервативно, но когда вы пытаетесь делать честные заявления о производительности, вы должны быть такими.
Поскольку DRNG работает на фиксированной частоте (800 МГц), в то время как частоты ядра могут варьироваться, количество тактов ядра на RdRand варьируется в зависимости от частоты ядра и количества других ядер, одновременно обращающихся к DRNG. Кривые, приведенные в презентации IDF, представляют собой реалистичное представление о том, чего ожидать. Общая производительность немного зависит от тактовой частоты ядра, но не сильно. Количество потоков - это то, что доминирует.
При измерении производительности RdRand следует быть осторожным, чтобы "использовать" результат RdRand. Если вы этого не сделаете, то есть, вы сделали это.. RdRand R6, RdRand R6,....., RdRand R6 повторялись много раз, производительность считалась бы искусственно высокой. Поскольку данные не используются до того, как они будут перезаписаны, конвейер ЦП не ожидает возвращения данных от DRNG, прежде чем он выдаст следующую инструкцию. Тесты, которые мы написали, записывают полученные данные в память, которая будет находиться в кэш-памяти на кристалле, поэтому конвейер останавливается в ожидании данных. Вот почему гиперпоточность намного эффективнее с RdRand, чем с другими видами кода.
Подробная информация о конкретной платформе, тактовой частоте, версии Linux и версии GCC была представлена на слайдах IDF. Я не помню цифры с макушки головы. Доступны чипы, которые работают медленнее, и чипы, которые работают быстрее. Число, которое мы дали для <200 циклов на инструкцию, основано на измерениях около 150 циклов ядра на инструкцию.
Чипы уже доступны, поэтому любой, кто хорошо разбирается в использовании rdtsc, может выполнить такой же тест.
Некоторая соответствующая информация содержится в Руководстве по внедрению программного обеспечения Intel Digital Random Generator (DRNG).
Дословная цитата:
Измеренная пропускная способность:
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
Вот некоторые показатели производительности, которые я получаю с помощью 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-поточный Ivybridge i7-3770 (3,4 ГГц) (4 ядра, 8 потоков) достиг пиковой пропускной способности 99,6 млн. 64-битных потоков в секунду на 3 потоках.
Я провел несколько предварительных тестов пропускной способности на реальном Ivy Bridge i7-3770, используя оболочку "librdrand" от Intel, и она генерирует 33-35 миллионов 32- битных чисел в секунду на одном ядре.
Это число 70M от Intel составляет около 8 ядер; для одного они сообщают только о 10M, так что мой тест более чем в 3 раза лучше:-/