Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 21:11   #1
meradone
 
Аватар для meradone
 
Регистрация: 16.11.2009
Сообщений: 4
По умолчанию Ассоциативность кеша

Нужно написать программу проверяющая на ассоциативность Кеш память.
Помогите, вообще мыслей нет, преподаватель задал и не хочет объяснять, что бы мы голову поломали...
meradone вне форума Ответить с цитированием
Старый 02.12.2009, 22:25   #2
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

meradone поподробней объясни что значит проверять на ассоциативность
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 02.12.2009, 22:34   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Действительно, неплохо бы знать, как проверять.
Вот есть немного мыслей. Например, у нас есть 4-канальный наборно-ассоциативный кеш. Выберем штук 8 элементов массива, которые будут попадать в один и тот же набор строк кеша, и будем что-нибудь в цикле с ними делать. А потом возьмём столько же элементов, но которые попадут в разные наборы. Во втором случае всё это будет работать быстрее, так как в первом случае строки постоянно будут вытесняться.
Что-то самому интересно стало... Набросал вот код, если не ошибаюсь, при diff = diffSlow должен работать медленнее, чем при diff = diffFast везде, если константы проставить под кеш процессора (и если какая-нибудь версия компилятора не выкинет полностью этот цикл; но $O- не надо ставить, а то будут мешать обращения к i и j в памяти). Ну, если слишком быстро, то итераций побольше.
Код:
{$APPTYPE CONSOLE}
{$O+,R-,Q-}

uses
  Windows;

const
  ways = 4;
  lineLength = 32;
  size = 16 * 1024;
const
  itemsCount = ways * 2;
  diffFast = (size div ways + lineLength) div sizeof(Integer);
  diffSlow = (size div ways) div sizeof(Integer);
  diff = diffSlow;

var
  a: array [0 .. diff * itemsCount - 1] of Integer;
  i, j: Integer;
  t: Cardinal;

begin
WriteLn('Let''s go!');
SetThreadAffinityMask(GetCurrentThread(), 1);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
t := GetTickCount();
for i := 0 to 100*1000*1000 do
  for j := 0 to itemsCount - 1 do
    inc(a[j * diff], i);
t := GetTickCount() - t;
WriteLn('Done in ', t, ' ms');
ReadLn;
end.
У меня примерно 16 секунд против 4,5.

Последний раз редактировалось Somebody; 02.12.2009 в 22:45.
Somebody вне форума Ответить с цитированием
Старый 02.12.2009, 23:48   #4
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Действительно, неплохо бы знать, как проверять.
Вот есть немного мыслей. Например, у нас есть 4-канальный наборно-ассоциативный кеш. Выберем штук 8 элементов массива, которые будут попадать в один и тот же набор строк кеша, и будем что-нибудь в цикле с ними делать. А потом возьмём столько же элементов, но которые попадут в разные наборы. Во втором случае всё это будет работать быстрее, так как в первом случае строки постоянно будут вытесняться.
Что-то самому интересно стало... Набросал вот код, если не ошибаюсь, при diff = diffSlow должен работать медленнее, чем при diff = diffFast везде, если константы проставить под кеш процессора (и если какая-нибудь версия компилятора не выкинет полностью этот цикл; но $O- не надо ставить, а то будут мешать обращения к i и j в памяти). Ну, если слишком быстро, то итераций побольше.

У меня примерно 16 секунд против 4,5.
хм... интересно...
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 03.12.2009, 20:32   #5
meradone
 
Аватар для meradone
 
Регистрация: 16.11.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Действительно, неплохо бы знать, как проверять.
Вот есть немного мыслей. Например, у нас есть 4-канальный наборно-ассоциативный кеш. Выберем штук 8 элементов массива, которые будут попадать в один и тот же набор строк кеша, и будем что-нибудь в цикле с ними делать. А потом возьмём столько же элементов, но которые попадут в разные наборы. Во втором случае всё это будет работать быстрее, так как в первом случае строки постоянно будут вытесняться.
Что-то самому интересно стало... Набросал вот код, если не ошибаюсь, при diff = diffSlow должен работать медленнее, чем при diff = diffFast везде, если константы проставить под кеш процессора (и если какая-нибудь версия компилятора не выкинет полностью этот цикл; но $O- не надо ставить, а то будут мешать обращения к i и j в памяти). Ну, если слишком быстро, то итераций побольше.
Код:
{$APPTYPE CONSOLE}
{$O+,R-,Q-}

uses
  Windows;

const
  ways = 4;
  lineLength = 32;
  size = 16 * 1024;
const
  itemsCount = ways * 2;
  diffFast = (size div ways + lineLength) div sizeof(Integer);
  diffSlow = (size div ways) div sizeof(Integer);
  diff = diffSlow;

var
  a: array [0 .. diff * itemsCount - 1] of Integer;
  i, j: Integer;
  t: Cardinal;

begin
WriteLn('Let''s go!');
SetThreadAffinityMask(GetCurrentThread(), 1);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
t := GetTickCount();
for i := 0 to 100*1000*1000 do
  for j := 0 to itemsCount - 1 do
    inc(a[j * diff], i);
t := GetTickCount() - t;
WriteLn('Done in ', t, ' ms');
ReadLn;
end.
У меня примерно 16 секунд против 4,5.
Спасибо за программу, но я так и не разобрался в чем заключается сама проверка на ассоциативность...
meradone вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц