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

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

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

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

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

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

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

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

=========

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

Я не могу прокомментировать эффективность 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](https://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);

```