Разделение памяти

Одно из ограничением использования SMP — является так называемое разделение памяти. Как вы понимаете, процессоры не могут одновременно обращаться к общей памяти. Процессоры должны синхронизировать свою работу при обращении к памяти, и по возможности записывать обрабатываемые данные в собственный кэш.

Следующий пример показывает эффект разделения памяти.

#include
#include
#include
#include
#define LOOP 50
#define SIZE 50000000
int main(int argc, char* argv[])
{
int t;
int i;
float elapse;
static char dummy[SIZE];
t = clock();
/* Функция clock() возвращает примерное число тактов сделанным процессоров с начала включения*/
for(i=0; i<LOOP; i++ ) {
memset( dummy, 0, sizeof( dummy) );
/*функция memset записывает в массив dummy значение 0 */ }
elapse = ( clock()-t ) / (float)CLOCKS_PER_SEC;
/* CLOCKS_PER_SEC переменная определенная в файле time.h и показывающая скорость работы процессора (число тактов в секунду) */
printf(Duration %f sec, %.1f MBytes/sec \n,
elapse, sizeof(dummy)*LOOP/elapse/1000000);
return 0;
}
>
Эта программа заполняет 50 мегабайт памяти нулями 50 раз подряд. Когда эта программа запускается в одном экземпляре, то ее время потраченное на ее работу равняется примерно 14.3 секунды, со скоростью передачи данных 175 Mб/сек. Если я запускаю эту программу в двух экземплярах, то время выполнения каждой становится равным примерно 24 секунды, а скорость передачи данных каждой программы составляет 100 Мб/сек. В итоге общая скорость работы с памятью становится равным 200 Мб/сек, что является 12.5% приростом по скорости (как мы видим это незначительный прирост)

Эта программа демонстрирует крайний случай, когда вся информация не может быть записана в кэш процессора. Также обратите внимание, что моя машина Celeron. Он имеет маленький кэш и работает на медленной шине по сравнению с процессорами Athlon или Pentium. Соответственно использование SMP системы здесь дает небольшой выигрыш. Выполняя эту программу последовательно два раза заняло бы по времени около 28 секунд. Но запуск в параллель дал нам 24 секунды.

Если мы в нашей программе сократим размер заполняемой памяти до 50 килобайт, то нам тогда должно хватить кэша нашего процессора. Так как у программы не будет проблемы разделения памяти. Увеличим число циклов до 250000 раз, что бы иметь такой же объем передаваемых данных. Выполнение единственного экземпляра программы займет теперь 10.6 секунды, при скорости передачи данных 1180 Мб/сек. Когда же мы одновременно запустим две программы мы получим примерно такое же время и скорость передачи данных для обоих программ. Что даст нам общую скорость 2360 Мб/сек. Как вы можете видеть вашим программам надо намного меньше обращаться к общей памяти, таким образом избегая простоя. Фактически мы получили 100% прирост производительности нашей системы.

Приведенные выше примеры это крайние случаи, которые в реальности вы скорее всего не встретите. Однако они демонстрируют особенности использования SMP технологии. Оценить реальную эффективность использования SMP технологии очень трудно.