Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2004 №2

Проектирование памяти с чередованием адресов

Хуа Лин  
Уэйн Вольф  

Использование так называемой расслоенной памяти (interleaved memory, память с чередованием адресов) — это эффективный способ увеличения пропускной способности системы. Высокая эффективность памяти такого типа объясняется 2 факторами: оптимизацией компактности кода доступа к данным и уменьшением числа конфликтов при доступе к памяти. В этой работе представлена система проектирования, которая учитывает оба способа оптимизации для нахождения минимального числа банков памяти для заданных ограничений разрабатываемой встроенной системы. В этой среде разработки используются такие способы оптимизации, как модификация циклов по работе с данными и изменение способа хранения данных для более быстрого и компактного доступа к этим данным; выборка потоков данных, определение конфликтов доступа, анализ размещения данных и определение оптимальной очередности доступа к данным. Экспериментально показано, что использование описываемой разработки приводит к созданию систем с меньшими аппаратными требованиями, чем без оптимизации.

1. Вступление

В системе с расслоенной памятью несколько банков памяти подключаются к одной шине, и каждый банк памяти определяется нижними битами адресной шины (рис. 1).

Это позволяет распределять доступ к шине во времени и при перекрытии операций. Примеры использования расслоенной памяти можно найти в области проектирования суперкомпьютеров, например CRAY X-MP [1], или в технологии Rambus [2]. Расслоенная память достигает высокой пропускной способности с уменьшением стоимости и числа контактов вывода.

Разработка системы с расслоенной памятью — это совместная аппаратно-программная задача. Программно реализуется оптимизация размещения данных, планирование компактного доступа к данным и уменьшение числа конфликтов доступа. Аппаратные задачи — распределение каналов и банков памяти и разделение пространства памяти. Все эти программные и аппаратные задачи взаимосвязаны. Например, добавление банков памяти может уменьшить число конфликтов доступа, но вместе с тем увеличить вероятность конфликта при кэшировании.

Рис. 1. Расслоенная память с 4 банками памяти
Рис. 1. Расслоенная память с 4 банками памяти

Вообще, конфликты доступа в расслоенной памяти могут значительно снизить ее пропускную способность. Когда на занятый банк памяти приходит запрос на доступ, он откладывается до освобождения банка. Таким образом, исполнение ряда последовательных запросов задерживается. Различные способы буферизации [3, 4] могут уменьшить потери в пропускной способности, но при этом может увеличиться стоимость системы. В этой работе мы рассматриваем системы без буферизации. Чтобы добиться наибольшей пропускной способности, необходимо правильно распределять запросы к данным между банками памяти.

При разработке высокопроизводительной памяти необходимо уделять внимание проектированию кэширования и тому, чтобы система работала с большими словами данных (wide-word). Для этого необходима оптимизация доступа к памяти, в результате которой, помимо всего прочего, доступ к банкам памяти будет производиться последовательно. Другие причины такой оптимизации:

  • Использование больших слов (wide-word) — более дешевый способ увеличить пропускную способность памяти, чем добавление новых банков памяти.
  • Оптимизированный доступ к памяти означает меньшее число промахов кэша, обращений к памяти и конфликтов.
  • Для кэша с обратной записью промах кэша ведет к возникновению конфликта доступа к памяти (двойной конфликт). Это происходит потому, что обычно число строк в кэше не меньше числа банков памяти, поэтому при обратной записи и последующем считывании одной и той же строки кэша информация отобразится на одном и том же банке памяти. При этом считаем, что все строки кэша имеют одинаковую длину, и память имеет модульную структуру. Write-through (сквозная запись, одновременное занесение данных в кэш и ОЗУ) не рассматривается из-за большой загрузки шины. Если при доступе к данным постоянно возникают двойные конфликты, то система будет вести себя так, как будто одновременно могут работать не более 2 банков памяти. Поэтому в нашей системе оптимизация доступа к памяти осуществляется до оптимизации дистрибутивности.

Анализ векторных потоков [3, 5] был хорошо изучен в области суперкомпьютеров. Однако в основном это анализ статической модели векторных потоков. В системах реального времени потоки данных зависят от хода исполнения программы, поведения кэша и распределения доступа. Эти динамические факторы также необходимо учитывать. Например, если в системе есть кэш, то данные необязательно сразу пойдут в основную память.

Рис. 2. Пример
Рис. 2. Пример

В коде на рис. 2 доступ к x[i,j] будет скрыт доступом к x[i+1,j] из-за группового повторного использования. Также и при единичном доступе к x[i,j+1] не всегда произойдет обращение к основной памяти из-за повторного самоиспользования. Термин «выделенный поток данных» означает те данные, которые действительно достигли основной памяти.

Предположим, что время ожидания для каждого банка памяти — nc. Тогда, если число банков памяти в канале связи больше nc (суперрасслоение памяти, super-interleaving), максимальная пропускная способность всего канала связи не увеличится, но число конфликтов доступа к памяти может уменьшиться, что приведет к расширению канала. При достижении определенного числа банков памяти в одном канале более дешевым способом будет добавление новых каналов. Требования по количеству каналов связи и банков памяти определяются рабочей нагрузкой и эффективностью их использования. В нашей системе проектирования мы начинаем с минимальной конфигурации, постепенно добавляя новые банки памяти и каналы связи. При этом распределяется доступ к памяти и размещение данных в памяти. Это происходит, пока не будет достигнута требуемая производительность.

В области проектирования встроенных систем расслоенной памяти уделялось мало внимания. Wuytack изучил возможность минимизации пропускной способности памяти, чтобы получить архитектуру с минимальным числом параллельных банков памяти и портов доступа к памяти [6]. При использовании расслоенной памяти задача совсем другая. Для уменьшения конфликтов доступа были предложены различные методы [7–11]. В этой статье предложен новый метод— метод оптимального перераспределения доступа.

В следующей главе описывается модель архитектуры для нашей работы. В главе 3 детально описывается работа нашей системы, в частности оптимизация доступа к данным и оптимизация дистрибутивности, а также процесс определения минимальных требований к памяти. В последней главе дан пример использования нашей системы и выводы.

2. Модель архитектуры

Предположим, что все потоки данных имеют однообразную структуру, и можно отследить, какие именно потоки данных являются выделенными(то есть достигают основной памяти). Примеры таких приложений — обработка мультимедиа или беспроводной коммуникации.

Упрощенная модель такой архитектуры показана на рис. 3.

Рис. 3. Модель архитектуры
Рис. 3. Модель архитектуры

Генератор адресов работает совместно с процессором. Когда процессор работает с текущей итерацией n, генератор адресов заранее достает из памяти в кэш следующий блок данных для итерации n+1 и возможно записывает результат предыдущей итерации n–1 из кэша в основную память (обратная запись, write-back). Для обратной записи выделяются те строки кэша, для которых предсказывается скорое появление конфликтов-промахов. Каждая итерация здесь может быть также и итеративным пакетом, то есть набором нескольких последовательных итераций. Это делается для повышения эффективности планирования доступа к памяти. Основная память может состоять их нескольких каналов.

Эта модель уменьшает время простоя процессора с помощью упреждающей выборки данных в кэш и выборочного освобождения кэша. Требования к производительности памяти вычисляются с учетом баланса нагрузки, то есть время доступа к данным равняется времени обработки данных. Время обработки данных вычисляется при приравнивании к нулю времени считывания и записи данных из памяти. Выборочная очистка кэша минимизирует возможность появления двойных конфликтов, что согласно нашим экспериментам сильно повышает производительность памяти. Упреждающая выборка и очистка кэша для выделенных потоков данных статически планируются компилятором. Точная оценка работы выделенных потоков данных будет иметь значение при оценке производительности памяти. Система кэширования включает в себя такие необходимые инструменты, как запрет на блокировку при упреждающей выборке, флаг очистки для индикации состояния очистки строки кэша и др. Естественно, оттого, как будет реализован кэш, сильно зависит производительность памяти. Чтобы сконцентрироваться на проектировании основной памяти, будем предполагать, что структура кэша фиксирована и обладает приемлемыми характеристиками.

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

3. Структура системы проектирования

Работа нашей системы состоит из следующих этапов:

  1. Модификация формата данных и кода циклов для повышения компактности и доступа к памяти.
  2. Анализ промахов кэша с целью обнаружения выделенных потоков данных; улучшение формата данных для уменьшения числа промахов кэша.
  3. Приблизительный расчет минимального необходимого числа банков памяти и каналов связи.
  4. Начиная с минимальной рассчитанной конфигурации, улучшать расположение данных и планировать доступ к данным для уменьшения конфликтов памяти, потом проверка, удовлетворяются ли требования к производительности. Увеличивать число каналов памяти или банков памяти, пока не будет достигнута требуемая производительность.

Определим термины и обозначения. Для примера рассмотрим вложенные циклы, как показано на рис. 2. Каждая итерация обозначается двумя индексами i и j. Это вектор в двумерном пространстве. Мы называем его точкой цикла. Все множество точек цикла образует пространство цикла. Обращение к x[i,j+1] можно записать как

I — точка итерации, А — матрица ссылок, c— вектор смещения. Вектор D используется для вычисления адреса элемента массива относительно базового адреса массива. Например, адрес x[i,j] вычисляется как [i,j]*D относительно адреса x[0,0].

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

3.1. Улучшение компактности доступа к данным

Основная идея при оптимизации доступа к данным в цикле — циклы наибольшей глубины вложенности должны обрабатывать то измерение массива, в котором исполняется наибольшее число переходов по индексу. Определим вектор ISV (In-dimension Stride Vector, вектор шага по индексу для каждого измерения массива) как расстояние между двумя точками цикла, которые обращаются к данным в одном и том же измерении массива. Идея алгоритма:

Если ISV существует, тогда

  1. изменить расположение массива в памяти так, чтобы измерения, соответствующие вектору ISV, обрабатывались в том цикле, в котором обработка измерения происходит быстрее всего.
  2. Изменить цикл:

где T — матрица трансформации, d — вектор ISV. Таким образом, итерации, которые отображены в векторе ISV, становятся итерациями цикла самой глубокой вложенности.

Рассмотрим это на примере цикла на рис. 2. Для первого измерения ссылки x[I,j] вектор ISV = (1,0), то есть две точки цикла с вектором дистанции (1,0) будут обращаться к смежным данным в первом измерении x[I,j]. Допустим, компилятор хранит массив по рядам (строкам). Тогда раскладку памяти можно оптимизировать. Для этого надо поменять местами первое и второе измерение массива и также поменять местами внутренний и внешний циклы. Для второго измерения массива x вектор ISV=(0, 1). Если компилятор по-прежнему хранит массив по рядам, то ничего оптимизировать нельзя.

Для двух точек цикла I1 и I2, которые обращаются к смежным ячейкам данных в r-м измерении массива, имеем (Ø — неважно; надстрочный индекс Т — транспозиция; A' — подматрица матрицы А с удаленным рядом r):

Лемма 1: пространство ISV для r-го измерения массива с матрицей ссылок А — это пустое пространство для A'.

В нашем алгоритме для всех ссылок на массив находятся и учитываются векторы ISV. Подбираются подходящие трансформации для глобальной оптимизации всей работы. ISV накладывает частичное ограничение на трансформацию цикла, как это показано в уравнении (1). Чтобы определить, существует ли матрица трансформации и ее нахождения, были разработаны необходимые алгоритмы [12].

Совмещенная оптимизация кода циклов и размещения данных в памяти уже применялась ранее [13, 14]. В работе Cierniak и Li [13] применялся достаточно слабый алгоритм поиска формата размещения данных и матрицы трансформации. Kandemir в работе [14] предложил алгоритм, близкий к идее ISV. Но они так и не предложили систематического подхода к нахождению корректной матрицы трансформации.

3.2. Нахождение выделенных потоков данных

Нахождение выделенных потоков данных имеет значение для планирования доступа к памяти и оценки пропускной способности памяти. Если в системе есть кэш, то доступ к данным в выделенных потоках состоит из данных, передаваемых по шине памяти в результате промахов кэша. Поэтому ключевую роль играет именно анализ промахов кэша. Выделенные потоки данных отличаются от данных, передаваемых при промахах кэша, своей более подробной информацией — источник потока данных, время обращения и атрибуты (чтение, запись).

Так как анализ промахов кэша был детально изучен в работе Ghosh [15], здесь мы его обсуждать не будем. Вместо этого рассмотрим пример кода на рис. 2. Если массивы x и y не смешиваются в кэше, и кэш достаточно велик, чтобы содержать несколько рядов массивов x и y, можно ожидать, что от ссылки x[I,j] будет идти поток данных для обратной записи, поток чтения для x[i+1,j] из второго ряда массива x, поток чтения для x[I,j+1] для первого ряда x, и аналогично для массива y.

После анализа промахов кэша, если было обнаружено слишком много конфликтов по промахам кэша, применяется метод улучшения расположения данных. Это также описывается в работе [15].

3.3. Оценка минимальной конфигурации

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

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

Если нижние биты адресов используются для индикации каналов, nch округляется в большую сторону до ближайшей степени 2. Теперь, когда мы знаем рабочую нагрузку каждого канала, можно подсчитать минимальное число банков памяти в каждом канале.

3.4. Уменьшение числа конфликтов доступа

Изменение расположения данных изменит банки памяти, к которым будет осуществяться доступ. Перераспределение последовательности доступа изменит время доступа. Оба эти приема хороши для уменьшения числа конфликтов доступа. Мы применяем оба способа.

3.4.1. Расположение данных

Kurian предложил метод модульного разделения и расположения данных [11]. Но в реализации этого метода сложно вычислять адреса. В своей работе мы используем дополнение, слияние и смещение адресов.

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

Пусть ширина строки в банке w байт. Тогда шаг по индексу s в банке для последовательных обращений из одной ссылки равен:

Здесь I1 и I2 — две последовательные точки итерации. Если обе они внутри цикла с самым глубоким уровнем вложенности, I1 и I2 = [0, ...0, 1]T. Размерность вектора — это глубина вложенности циклов. На границе самого глубокого цикла I1 и I2 = [0, 0, ..., 0, 1, IL – IH ]T где IL и IH — верхняя и нижняя границы самоо глубокого цикла соответственно. Граничная ситуация рассматривается только, когда |IL – IH|<<nb, где nb — число банков памяти. Если s — четное, нам надо найти такое минимальное дополнение к самому быстро изменяющемуся измерению массива, что для вектора D1, построенного для измененного массива, выполняется условие:

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

Чтобы уменьшить конфликты для параллельных потоков данных, можно применить следующие методы:

  1. Слияние массивов. Два потока становятся фактически одним.
  2. Смещение относительно базового адреса. Например, если zn — это доступ к массиву z в банке n, то смещая базовый адрес массива y, поток данных

    может быть заменен на

    который имеет лучшую дистрибутивность.

3.4.2. Оптимальное перераспределение доступа

Если потоков данных много, могут возникать частые конфликты. Разделение циклов— это прием, который помогает легко разделить потоки данных там, где этот подход применим. Corral [7] и Lee [8] изучили методы перераспределения доступа к данным. Их методы применимы для нескольких потоков, которые обращаются к одному и тому же подмножеству банков памяти. Метод оптимального перераспределения доступа, предложенный здесь, эффективен для любых потоков данных.

Рис. 4. Таблица планирования доступа
Рис. 4. Таблица планирования доступа

Посмотрим, как это происходит. Пусть дан единственный канал с nb банками с индексами от 0 до nb-1. Для потока данных {si}i=1 с периодом p, где si — номер банка, к которому идет запрос, рассмотрим один период S={si}pi=1. Общее число обращений к банку i обозначим vi. Пусть vmax ({vi }ni-1i=1, а Bmax — множество банков, которые получают обращения максимум vmax число раз. Имеем:

Лемма 2: минимальное время обработки запросов в потоке S — это максимум из p и nc×vmax.

Доказательство:

Предположим, t — это время обработки запросов в потоке S. Очевидно, t≥p. Так как поток периодичен, и минимальное время задержки перед повторным доступом к банку nc, то t≥ n1× vmax или t ≥ max (p, n1,×vmax). Далее, для доказательства достижимости минимального времени, построим таблицу (рис. 4).

Как видно, таблица имеет vmax рядов и неопределенное число колонок. Заполним таблицу обращениями к памяти по колонкам, снизу вверх, слева направо по следующим правилам:

  1. запросы в один и тот же банк заполняются последовательно;
  2. запросы в банки из множества Bmax заполняются в первую очередь, а затем для всех остальных банков.

Доступ планируется по рядам. Если число обращений в ряду n≥nc, тогда считаются все обращения; иначе считаются все обращения в ряду плюс nc – n временных слотов без обращений. Как видим, в этом планировании нет конфликтов, и достигается минимальное время. Доказательство очевидно, и мы его опускаем.

В качестве примера, поток данных

можно перераспределить в

с меньшим числом конфликтов.

Мы рассматриваем периодические потоки данных для простоты доказательства, так что конечные циклы последовательности обращений не осложняют его. Для очень длинных последовательностей, когда некоторые конечные циклы не важны, лемма 2 справедлива и для непериодических последовательностей.

Из леммы 2 легко следует: для минимального времени обработки перераспределенных обращений к памяти tmin и потока данных S, который состоит из многих потоков Si(i = 1, ..., k), справедливо

Известно, что при наличии нескольких потоков данных часто возникают конфликты. Но при использовании перераспределения доступа ситуация улучшается, поскольку производительность будет не хуже исходной.

3.4.3. Реализация

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

Рассмотрим следующий поток данных

Сначала мы смещаем базовый адрес массива z так, что обращения z→1,z→3 меняются на z→2,z→4. Затем поток данных переопределяется на

Это дает лучший результат, чем непосредственное перераспределение.

Размещение данных тщательно проверяется, чтобы избежать конфликтов при промахе кэша. Если все нормально, применяется новое размещение данных. Наименьший период среди всех потоков данных принимается за «атомарную» величину при планировании перераспределения данных (это относится к пакетам итераций, о которых говорилось в разделе 2). Если длина пакета слишком большая, чтобы кэш мог и сделать упреждающую выборку, и при этом не удалить другие нужные данные, надо разбить один период на более мелкие отрезки, заново спланировать их, учитывая новые возможные конфликты. Если в системе много каналов, их можно считать либо параллельными, либо последовательными. Перераспределение доступа для любой конфигурации — это прямое расширение доказательства леммы 2.

3.5. Назначение каналов и банков памяти

Для данной конфигурации памяти лемма 2 дает нам минимальное время обработки запросов к памяти после перераспределения доступа. Если после этого производительность все еще неудовлетворительна, надо увеличить число банков или каналов памяти. После этого надо перезапустить алгоритмы из п. 3.6, так как они зависят от конфигурации памяти.

Рисунок 5 показывает интерактивную процедуру по определению числа каналов nchи банков nb. В псевдокоде nmax — это максимальное допустимое число банков в канале, TPROC — требование по производительности, tmin(nb, nch) — время перераспределенного доступа, как функция от nb и nch, которая может быть подсчитана по лемме 2.

Начиная с нижней границы (nb, nch), подсчитанной в п. 3.5, делаем следующее:

Рис. 5. Процедура оптимизации
Рис. 5. Процедура оптимизации

Если число банков памяти в канале достигает nmax, а требование по производительности все еще не выполяется, добавляем новые каналы для увеличения пропускной способности памяти. В то же время число банков в канале уменьшается до nc, то есть до минимального числа банков, необходимых для достижения наибольшей пропускной способности.

4. Эксперименты и заключение

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

Тестовые программы были скомпилированы компилятором DLX, а результаты трассировки были отправлены на симулятор DineroIII [16]. Мы немного изменили DineroIII, чтобы он мог трассировать потоки данных на шине. В полученной трассировке предполагалось, что доступ к памяти осуществляется очень быстро. Это делалось, чтобы смоделировать работу на мощном процессоре. На рис. 6 DCT — это Discrete-Cosine Transform, дискретное косинусное преобразование (математическое преобразование, используемое в алгоритмах сжатия изображений, например, в JPEG). Это быстрый алгоритм, взятый из MMSG [17], использованный на 352×288 изображении (2 байта/пиксель). FS — полный поиск по тому же изображению, а MUL — перемножение матриц 256×256 (байт). Использовался двунаправленный ассоциативный кэш 16 кбайт с длиной строки 32 байта. Основная память — одноканальная, время задержки — 4 такта, n банков, строка 32 байта. Столбики означают сравнительную производительность.

DCT и FS работают с блоками памяти и поэтому имеют довольно высокую компактность данных. Тем не менее результаты исходных систем слабые. Трассировка работы DCT и FS показала, что половина потери производительности происходит из-за двойных конфликтов. Другая половина — из-за промахов кэша, которых можно было избежать правильным размещением данных в памяти. Тестирование также показало, что увеличение числа банков памяти необязательно ведет к повышению производительности, если не была проведена оптимизация. Неоптимизированная работа MUL показывает слабую производительность из-за плохого размещения данных и неоптимизированного кода доступа к данным.

Рис. 6. Сравнение производительности
Рис. 6. Сравнение производительности
Таблица. Результаты эксперимента
Таблица. Результаты эксперимента

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

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

5. Благодарность

Эта работа была спонсирована Национальным фондом науки и Центром технологии System-on-Chip в Нью-Джерси (США).

6. Литература

  1. CRAY X-MP Series Mainframe Reference Manual. Cray Research Inc. HR-0032.Nov. 1982.
  2. http://www.rambus.com.
  3. R. Raghavan, J. P. Hayes. Reducing interference among vector accesses in interleaved memories // IEEE Trans. Comput. Vol. 42. No. 4. Apr. 1993.
  4. K. A. Robbins, S. Robbins. Buffered banks in multiprocessor systems // IEEE Trans. Comput. Vol. 44. No. 4. Apr. 1995.
  5. W. Oed, O. Lange. On the effective bandwidth of ineterleaved memories in vector processor systems // IEEE Trans.Comput. Vol. C-34. No. 10. Oct. 1985.
  6. S. Wuytack, F. Catthoor, G. de Jong, B. Lin, H. de Man. Flow graph balancing for minimizing the required memory bandwidth // Proc. IEEE 9th Int. Symp. Sytem Synthesis (ISSS'96). La Jolla, CA, USA. Nov. 1996.
  7. A. M. delCorral, J. M. Llaberia. Minimizing conflicts between vector ctreams in interleaved memory systems // IEEE Trans. Comput. Vol. 48. No. 4. Apr. 1999.
  8. D. L. Lee. Memory access reordering in vector processors // IEEE Symp. High Perfomance Comput. Architecture. Raleigh, North Carolina, USA. Jan. 1995.
  9. D. H. Lawrie. Access and alignment of data in an array processor // IEEE Trans. Comput. Vol. C-24. Dec. 1975.
  10. B. R. Rau. Pseudo-random interleaved memory // Proc. 18th Int. Symp. Comput. Architecture. Toronto, Canada. May 1991.
  11. L. Kurian, B. Choi, P. T. Hulina, L. D. Coroor. Module partitioning and interleaved data placement schemes to reduce conflicts in interleaved memories // Proc. Int. l Conf. Parallel Processing. Vol. 1. 1994.
  12. http://www.ee.princeton.edu/~hualin/ seminar.ppt.
  13. M. Cirniak, W. Li. Unifying data and control transformations for distributed shared memory machines // Proc. SIGPLAN'95 Conf. Programming Language Design and Implementation. Jun. 1995.
  14. M. Kandemir, J. Ramanjujam, A. Choudhary. Improving cache locality by a combination of loop and data transformations // IEEE Trans. Comput. Vol. 84. No. 2. Feb. 1999.
  15. S. Ghosh. Cache Miss Equations: Compiler Analusis Framework for Tuning Memory Behaviour / Ph. D. Theses. Dept. of Electrical Eng., Princeton University. Nov. 1999.
  16. M. Hill, A. Smith. Evaluating associativity in CPU caches // IEEE Trans. Comput. Vol. 38. No. 12. Dec. 1989.
  17. http://www.mpeg.org/MPEG/MSSG/.

Скачать статью в формате PDF  Скачать статью Компоненты и технологии PDF

 


Другие статьи по данной теме:

Сообщить об ошибке