Измерение полосы пропускания основной памяти

Я хочу измерить пропускную способность основной памяти и при поиске методологии, я обнаружил, что,

  1. многие использовали функцию bcopy 'для копирования байтов из источника в пункт назначения, а затем измеряют время, которое они сообщают в качестве полосы пропускания.
  2. Другие способы сделать это - выделить и массировать и пройти через массив (с некоторым шагом) - это в основном дает время для чтения всего массива.

Я попытался сделать (1) для данных размером 1 ГБ, а ширина полосы пропускания, которую я получил, составляет «700 МБ/с» (я использовал rdtsc , чтобы подсчитать количество циклов, прошедших для копии). Но я подозреваю, что это неверно, потому что моя конфигурация RAM выглядит следующим образом:

  1. Скорость: 1333 МГц
  2. Ширина шины: 32 бит

Согласно википедии теоретическая ширина полосы вычисляется следующим образом:

тактовая частота * ширина шины * # бит за такт в строке (2 для ddr 3   ram) 1333 МГц * 32 * 2 ~ = 8 ГБ/с.

Таким образом, мой полностью отличается от предполагаемой пропускной способности. Любая идея, что я делаю неправильно?

=========

Другой вопрос: bcopy включает в себя как чтение, так и запись. Значит ли это, что я должен разделить рассчитанную полосу пропускания на два, чтобы получить только чтение или только пропускную способность записи? Я хотел бы подтвердить, является ли пропускная способность просто обратной латентностью? Просьба предложить любые другие способы измерения пропускной способности.

2
Вы, кажется, забываете о важности кэширования на существующих машинах. И как вы определяете свою пропускную способность памяти? С точки зрения программиста, это то, что происходит в memcpy. Кроме того, у вас, вероятно, есть другие процессы, запущенные на вашем компьютере (так что дополнительные переключатели контекста и т. Д.). Я не понимаю, что вы хотите точно измерить!
добавлено автор Basile Starynkevitch, источник
Комментарий Базиля лежит в основе дела ... современные потребительские ПК - это жестоко усложненные животные, и производительность, которую вы видите, зависит от того, что вы делаете. Существует несколько уровней кеша; отраслевое прогнозирование, спекулятивное выполнение конвейеров в ЦП; прерывания; другие процессы; Периферийные устройства DMA, которые хотят использовать (множественные!) Шины; и т. д. Этот вопрос имел бы гораздо больше смысла на моем Apple] [+.
добавлено автор dmckee, источник

1 ответы

Я не могу прокомментировать эффективность bcopy, но самый простой подход - это второй метод, который вы указали (с шагом 1). Кроме того, вы смешиваете биты с байтами в своем уравнении пропускной способности памяти. 32 бит = 4 байта. Современные компьютеры используют 64-битные шины памяти. Таким образом, ваша эффективная скорость передачи (при условии, что технология DDR3)

1333Mhz * 64 бит/(8 бит/байт) = 10666 МБ/с (также классифицируется как PC3-10666)

В 1333 МГц уже есть 2 передачи/часы.

Check out the wiki page for more info: http://en.wikipedia.org/wiki/DDR3_SDRAM

Что касается ваших результатов, попробуйте еще раз с доступом к массиву. Malloc 1GB и пройти все это. Вы можете суммировать каждый элемент массива и распечатывать его, чтобы ваш компилятор не думал, что это мертвый код.

Что-то вроде этого:

double time;
int size = 1024*1024*1024;
int sum;
*char *array = (char*)malloc(size);
//start timer here
for(int i=0; i < size; i++)
  sum += array[i];
//end timer
printf("time taken: %f \tsum is %d\n", time, sum);
0
добавлено