Тест памяти
|
|
ivanna2004 | Дата: Суббота, 26-Фев-2011, 9:45:09 | Сообщение # 1 |
Подполковник
Группа: Администраторы
Сообщений: 113
Награды: 2
Репутация: 1
Статус: Offline
| Тестирование памяти Мысли о не совсем очевидных проблемах с тестированием памяти. С О Д Е Р Ж А Н И Е Общепринятые методы тестирования памяти Писать/читать, или как? Как устроен SDRAM Мой тест работает так ...
|
|
| |
ivanna2004 | Дата: Суббота, 26-Фев-2011, 9:46:49 | Сообщение # 2 |
Подполковник
Группа: Администраторы
Сообщений: 113
Награды: 2
Репутация: 1
Статус: Offline
| Общепринятые методы тестирования памяти. Немного пройдусь по тестам, которые как-то принято использовать для проверки памяти. Важный момнет - каждый тип теста ориентирован на какие-то свои, специфические типы сбоев, подчас эи сбои сможет диагностировать только подобный тест, но когда я буду говорить о эффективности метода, то рассуждения будут касаться некотой усредненной обнаруживающей способности для не_специально отобранныз модулей памяти. Бегущая 1. Вся память расписывается числом из одних нулей с установленным одним битом, 0...001 и проверяется на совпадение. Потом шаблон циклически сдвигают на один бит и повторяют тест. (т.е следующий шаблон будет 0...010, потом 0...100 и т.д.). Для завершения одного полного цикла тестирования надо столько проходов, скольки разрядный шаблон. Обычно это dword, т.е. 32 бита (прохода). Тест имеет эффективность ниже среднего т.к. проверяет только сбои по данным. Очень продолжительный. Бегущий 0. Аналог "бегущей 1", только данные инверсны. Шаблон имеет все установленные биты кроме одного, вида 1...110, 1...101 и т.д. Эффективность аналогична предыдущему. Эти тесты имеет смысл проводить парами - вначале один, потом второй - это поднимет их взаимную эффективность. Запись константой. Память расписывается одним и тем-же числом, само число не является бегущим 0 или 1. При повторном проходе шаблон как-то модифицируется. Сложно сказать, обычно эффективность ниже первых двух тестов. В качестве некоторого положительного бонуса - количество проходов может быть произвольным. Запись константой A/неA. Идея в том, что шаблон генерируется по принципу записи в соседние адреса прямо противоположные данные (инверсию). Например, если используется правило 'бегущая 1', то шаблон будет иметь вид: addr0: 0...001 addr1: 1...110 addr2: 0...001 addr3: 1...110 Таким образом достигается три действия: - увеличивается нагрузка на шину передачи данных - в соседних ячейках лежат инверсные данные - при сбое адреса существует некоторая вероятность, что будет запорчена ячейка В качестве шаблона может участвовать бегущий 0, 1 или любая другая константа. Если опустить незначащие мелочи, то, по сути, так работает постоянный шаблон в TM1. Эффективность зависит от длины шаблона и менятся от эффективности "запись константой" (т.е низкой) до "выше среднего". Например, если сделать шаблон равный байту, то его эффективность не будет отличаться от "запись константой". В качестве оптимизации надо принять разрядность шины данных того устройства, которое тестируется. Переменный шаблон (монотонный). Принцип аналогичен записи константой, но после записи шаблон несколько модифицируется. Как самый простой вариант - в ячейку записывается ее адрес. Эффективность метода зависит от типа модификации шаблона - чем больше бит изменилось, тем больше повышается его эффективность от уровня "запись константой" до "запись А/неА". Вторым нюансом является возможность обнаруживать адресные сбои. В TM1 в качестве типа 'переменный шаблон' используется модификация путем вычитания 7. Это обеспечивает достаточно большой период повтора шаблона и редкое изменение числа - тест приближается к виду А/неА. В переменном шаблоне нет смысла делать тест типа 'бегущая 1' (кроме случая его циклического сдвига), ведь последующее число будет существенно отличаться по смыслу. Шумоподобный шаблон. Вся память расписывается шумоподобным числами. Вроде-бы простой, а, подчас, весьма эффективный тест. Увы, очень медленный, надо очень много проходов, если сравнивать со всеми перечислинными. Parity. В качестве шаблона используется битовое значение parity к адресу этого бита и его относительному номеру в байте (слове, двойном слове и т.д.). Тест имеет бесконечный период повтора и весьма хорошую повторяемость шаблона А/неА. Я не исследовал именно этот алгоритм, но, думаю, его эффективность будет не хуже средней.
|
|
| |
ivanna2004 | Дата: Суббота, 26-Фев-2011, 9:47:33 | Сообщение # 3 |
Подполковник
Группа: Администраторы
Сообщений: 113
Награды: 2
Репутация: 1
Статус: Offline
| Теперь от монотонных тестов перейдем к 'прыгающим' - тестам, где адрес меняется не линейно. Периодический. При записи адрем следующей записи несколько смещен относительно текущей. Самый простой вариант - писать через один адрес двумя проходами, вначале четный, потом нечетный. Подобный прием увеличивает загрузку матрици SDRAM (интенсивнее меняются данные по соседним адресам) и шины ввода-вывода. Можно использовать как постоянный, так и переменный шаблон. Здесь важно отметить одну особенность - предвыборка данных в процессорной системе (блок ввода-вывода процессоа, система кеширования, контроллер SDRAM), оптимизированной для потокового доступа, вызывает считывание и запись бОльшего объема данных, чем используется в тесте. Это вызывает засорение cache и несколько снижает производительность. Если утрировать, то - если тест меняет только байт, то все равно будет считан и записан блок, равный размеру строки cache (32-64-128байт, зависит от процессора). Плохо или хорошо - зависит от использования этой особенности в тесте. Прыгающий тест применен в TM2, он очень эффективно ловит некоторые типы сбоев, но в среднем он несколько хуже потоковых методов. Псевдослучайный. Разновидность предыдущего способа, адрес обращения выбирается по некоторому закону. Обычно, в периодическом тесте размер прыжка выбирают по степени двойки, чтоб уменьшить потери времени и упростить реализацию. Это не слишком хорошо сказывается на эффективности. Вариант с псевдослучайным обращением может несколько улучшить дело (а может и нет!). Подобный алгоритм еть в известной программе RST, его эффективность ... сложно сказать. В некоторых случаях очень эффективно, а 'в среднем' - см. выше. Вообще говоря, разработчики ПО как-то не обращают внимание на не_аотоковое тестирвоание, потому особо большого разнообразия не наблюдается. Регенерация. В SDRAM информация хранится в конденсаторах. Со временем заряд конденсаторов уменьшается, и данные исчезают. Чтоб этого небыло надо периодически обновлять информацию - это можно делать путем считывания строк (столбцы можно не перебирать), хотя-бы по 1 байту. При записи регенерация делается автоматически. На тот случай, если процессору не надо считывать некоторые строки и информация не рассыпалась применяют схему регенерации - контроллер SDRAM без участия процессора периодически перебирает все строки. Т.к. при этом он занимает SDRAM и снижает производительность памяти (увеличивает время доступа), то скорость регенерации выбирают минимально- неоходимой для надежного восстановления заряда конденсаторов. Это время очень сильно зависит от температуры микросхем SDRAM, если для 20-30 градусов время рассыпания матрици составляет десятки секунд, то при высокой температуре время становится меньше секунды. Есттественно, в первую очередь 'осыпаются' элементы матрици с дефектами. На этой эффекте построен тест DeMarsh. Идея достаточно проста - отключается регенерация и смотрится, когда посыпется память. Впрочем, простые идеи не всегда просто реализовать, ведь программа тоже находится в памяти и ее выполнение неизбежно вызовет перебор адресов, т.е. регенерацию некотрой части SDRAM. Если под DOS такую программу и можно сделать, то под Windows - крайне затруднительно. К сожелению, DeMarsh очень аппаратно зависим, а автор не собирается развивать свою программу. Упрощенный вариант проверки регенерации сделать не трудно - как-то расписать всю память, подождать XXX секунд/минут, проверить сохранность данных. Но и тут проблемка - если используется сегментный метод тестирвоания, а не всей памяти, то с тестом регенерации возникают трудности....
|
|
| |
ivanna2004 | Дата: Суббота, 26-Фев-2011, 9:49:30 | Сообщение # 4 |
Подполковник
Группа: Администраторы
Сообщений: 113
Награды: 2
Репутация: 1
Статус: Offline
| Писать/читать, или как? Обычно считают так - есть память размера ХХХ, значит надо ее как-то записать, потом выполнить чтение/сравнение, это и будет проверка. Вообще-то, я сталкивался и с еще более запущенным случаем, когда алгоритм тестирования состоял в записи слова, его считывании/проверки и переходу к последующему адресу. Естественно, подобный шедевр в принципе не мог обнаружить адресные сбои. Кроме того, из-за системы кеширования данные считывались не из SDRAM, а брались из cache, т.о. вообще никаких ошибок не могло быть обнаружено ... разве только в cache. Впрочем, я отвлекся. Очередность операций записи и чтения Всю память или сегментами? Современные процессоры не могут достаточно быстро выполнять тестирование памяти. Для AMD эта проблема в построении процессора и, похоже, навсегда. У Intel есть реальныая возможность в улучшении - сейчас всё ограничивает внешний контроллер памяти и после встраивания его в кристалл процессора, думаю, проблема взаимодействия с внешней памятью значительно ускорится. На данный момент для нужд профессионального тестирования я бы рекомендовал оптимизировать программы под процессоры Intel. Вопрос оптимизации под процессоры будет рассмотрен ниже ... может быть. На данный момент размер памяти в 4G является обычным случаем и при производительности теста 1Gb/s (а это очень-очень быстрый тест) время только одного прохода составит 4 секунды! Если используется алгоритм "бегущая 1" и размер слова 32 бита, то - только один запуск теста займет 2 минуты. Одним тестом вряд-ли можно обойтись, они каждый ориентирован на какой-то свой тип сбоев, потому время растет катастрофически. Кроме того, TM1 показал, что на одну запись лучше делать несколько проверок (чтение/сравнение). Время растет. 10 минут на очень упрощенную проверку и час на полную - это не слишком удачная идея, особенно при коммерческой эксплуатации тестов, время проведения тестов вполне предсказуемо сказывается на цене конечной памяти. Применять исключительно 'аппаратные' методы тестирования? ... несомненно, но для обычного случая это не реально, разработка ASIC стоит весьма дорого (и долго). Sorry, я опять отвлекся. Положим, время одного прохода 4 секунды, весь тест из 5 проходов. Т.о., время теста составит 20 секунд. Хорошо, теперь с другой стороны - нам не нужен тест сам в себе, программа тестирования должна симулировать работу с памятью обычных приложений. Вы знаете программу, которая записывает все 4Gb, а потом всё это вычитывает? Я как-то затрудняюсь. Обычно программы работают с небольшими объемами памяти, причем могут делать это весьма интенсивно. Обращение к памяти неизбежно вызывает нагрев, а т.к. используется только небольшой фрагмент матрици памяти, то и нагрев локальный (и явно бОльший). Значит, стоит подумать над тем, чтоб разбить тестирование с 'всей' памяти на работу с сегментами. И какой размер сегмента брать? ... По идее, в IBM PC совместимом компьютере работа ведется с страницами по 4Kb, значит стоит сделать сегмент = 4Kb? Ага, попробуйте. Система кеширования не выпустит запрос на чтение из себя, потому Вы будете тестировать cache, а не системную память. Можно делать сброс cache после записи страници, но сама операция flush выполняется так долго, что - забудьте! Для некоторых процессоров (Pentium2,3, AMD K7) известно, как отключить cache 2 level, а с современными это нерешаемая проблема (на данный момент). Тут действует принцип "Неуловимого Джо", никому это не надо. Надо для тестирвоания, но вот именно для этого вряд-ли фирмы AMD и Intel вряд-ли расстараются. Придется протягивать ножки по тему одеялу, что есть. А именно - размер сегмента должен быть больше кешируемого размера. Т.е больше cache 2 level или, если присутствует, cache 3 level. Можно делать размер сегмента больше cache теущего процессора или сделать его просто большим для совместимости с процессорами на ближайшие несколько лет. Судя по спецификациям Intel, относительно скоро выйдут процессоры с cache в 24Mb, т.о. делать размер сегмента в 32Mb?? Скучно. Для примера, в TM4 размер сегмента 512Kb и вовсе не просто так. В S&M он больше, но это уже тоже исчерпано. На процессоре с cache 24Mb S&M будет работать уже совсем не так, как задумывалось изначально, эффектиность наверняка упадет. Другое измерение - время. До сих пор шла речь о линейных или псевдослучайных процедурах проверки, но можно взаимно вложить процедуры записи и проверки различных зон памяти. Например, такой алгоритм: Трехпроходовая запись/чтение по шагам (третий тест в TM4): 1 write 1/3 2 write 2/3 3 write 3/3 4 read 1/3 5 write 1/3 6 read 2/3 7 write 2/3 8 read 3/3 9 write 3/3 10 read 1/3 11 read 2/3 12 read 3/3 Думаю, идея понятна - несколько иначе работает поиск сбоев адресации и 'в другой плоскости' проверяется взаимовлияние бит данных. Число '3' выбрано не случайно, подумайте. Строго говоря, псевдослучайные тесты обладают схожими свойствами, но они практически все оперируют величинами-адресами строго кратными 2^n, что крайне неудачно для тестирования накопительной матрици и выборки - адресные линии меняются всегда одинаково. Подобное временное складывание очень эффективно на некоторых ошибках, в-среднем эффективность теста средняя.
|
|
| |
ivanna2004 | Дата: Суббота, 26-Фев-2011, 9:50:51 | Сообщение # 5 |
Подполковник
Группа: Администраторы
Сообщений: 113
Награды: 2
Репутация: 1
Статус: Offline
| Как устроен SDRAM (Увы, бОльшая часть информации не проверена, имейте в виду) Думаю, основные идеи построения микросхем типа SDRAM Вы уже знаете, потому переду к тому, что не лежит на поверхности. Нас учат, что выборка в SDRAM состоит из 2х стадий - вначале информационные емкости (данные) коммутируются по номеру строки, потом следует вторая стадия коммутации - по номеру столбца нужные емкости подключаются к усилителю считывания. Нас учат и мы свято верим. Потом наступает стадия взросления и вера как-то пропадает. Уж больно крамольные мысли заползают в голову - ба, а накопительная емкость-то мизерная. Мало того, линия коммутации тоже имеет емкость и она несоизмеримо больше информационной емкости! В электронике чем отчетливей сигнал, тем четче и быстрее он может быть отождествлен. SDRAM работает на очень высоких скоростях, не вяжется это с верой, которую нам насождают! После некоторых поисков выясняется, что наши сомнения имели под себе почву - сделано все совсем не так, существуют коммутаторы только первого уровня (номер строки). Второй уровень коммутатора делается уже не с аналоговым сигналом, а полностью цифровым. Отсюда следует интересное свойство - производительность стандартной микросхемы SDRAM ограничено исключительно скоростью, с какой можно передать данные наружу. Поэтому появление DDR*** вполне очевидно. Я предполагаю, что чип SDRAM по по выборке строки выбирает всю строку в буфер. Длина строки (page) может различаться из-за организации, но она имеет цифру порядка 2К. Т.о., за одну выборку SDRAM может выдать до 2К/chip. Т.к. при обращении в памяти используется блочный доступ, чаще всего 8 выборок, то - путем переделки только узла ввода-вывода можно повышать кратность 'DDR' до 2К/8=256. Короче, хватит надолго. Важно ли это для теста памяти? ... несомненно! Это значит, что при выборке строки выбирается вся строка(page) полностью. Вопрос на подумать - а что будет, когда попросят адрес, который уже есть в считанной строке? Вы уверены, что SDRAM не возмет его из буфера без инициализации чтения матрици? Ась? И не пытайтесь говорить, что это не важно для теста памяти. Далее, что представляет собой первый уровень коммутатора? Это накопительные конденсаторы, коммутатор и усилитель. Один усилитель на всю шину данных? Угу, ученые, ничему уже не верим. Немножко в сторону, но к месту - а Вы знаете, что кристаллы памяти всегда делают с одной и той-же разрядностью, а сама разрядность 4-8-16бит определяется скрытыми перемычками при затарке в корпус? Я к чему - в SDRAM нет жесткой привязки к размеру строки, это конфигурируется. С другой стороны, при увеличении емкости чипа придется усложнять схему усилителя из-за возрастания степени коммутатора. В полупроводниковой технологии стараются использовать примитивы, так дешевле и надежнее. Что дает А + B ? То, что на один усилитель считывания приходится ограниченное кол-во накопительных конденсаторов, которые в разы меньше длины строки (page). Т.е, даже первый коммутатор частично коммутирует конденсаторы, частично предвыбирает из нескольки строк с выходов усилителей (неполная выборка). Кстати, на этом этапе должен осуществляться remap - переназначение резервных строк вместо сбойных. Конвейер/Dual - блок доступа. При обращении к DIMM контроллер оперирует несколько бОльшими объемами данных, чем байт. Вообще-то аппаратура можен записать или прочитать только байт, но, в реальности, так никогда не делается. У технологии SDRAM большие накладные расходы на выборку строки (фазы выдачи RAS/CAS), а вот данные выдаются уже быстро. (remark: повторюсь, это связано с тем, что выборка данных из матрици ведется в аналоговой форме, а это очень долго. После этого следует фазы выборки данных из выходного буфера, а это цифра и быстродействие ничем не ограничено). Для повышения производительности делают конвейерный доступ - выдают адрес, откуда будут считывать, потом следует чтение данных с автоматическим инкрементом адреса. Точнее, адрес последующих данных ограничен некоторой разрядностью. При выборке 8 данных адрес может быть 0-1-2-3-4-5-6-7, а если начать читать не с 0, а, например, 5, то адрес будет 5-6-7-0-1-2-3-4. Т.о. мы, с одной стороны, получаем весь блок данных, с другой - нужный именно сейчас адрес обрабатывается в первую очередь. Т.о., всегда делается несколько выборок данных. Для старых процессоров это было 4, для современных - 8. Второй нюанс - память может стоять в Single или Dual режиме. В последнем случае разрядность соседние DIMM соединяются парами и превращаются как-бы в один DIMM с разрядностью данных 128бит. Кроме того, в некоторых процессорах (AMD K10) может быть несколько независимых контроллеров памяти с различным наложением адресов. Плюс к тому, доступ из разных ядер к разным контроллерам может различаться по времени - у ядер есть 'родные' и 'чужие' контроллеры памяти, для доступа к последним данные передаются через общую шину. Что полезного можно вынести из этого для тестирования памяти: - выбирается вся строка целиком. Кстати, раз строка выбралась, то она сразу и перезаписывается (регенерация) - усилитель работает с меньшим количеством бит(конденсаторов), чем принято думать. Это важно при выборе принципа генерации данных для проверки матрици. - сама строка передается не в аналоговом, а в цифровом виде, потому имеет другой вид сбоев, да и интенсивность их много-много ниже. - при составлении шаблона тестов интерфейса надо учитывать количество и разрядность данных. AMD K10 требует специальной оптимизации, иначе получится 'непонятно что'. Кстати, а Вы знаете, что в DRAM половина информации хранится в инверсном виде? Т.е. записывая 0 по всем адресам, в половине ячеек будет лежать0, а в другой 1. Это делается для того, чтоб уменьшить броски тока при передачи данных - очень часто программы и данные содержат в себе много нулей, а так в памяти физически будет лежать смешанный сигнал из 0 и 1. Мой тест работает так ... ... на что хочется сразу возразить - это Вам так кажется. Возьму тот-же пример, что рассматривал выше: 1 write 1/3 2 write 2/3 3 write 3/3 4 read 1/3 5 write 1/3... Только буду работать не с всем сегментом памяти, а с единицей обмена = 8 байт. Думаю, понятно, почему 8 байт - это 8*8=64 бита. Разряжность DIMM Вам известна. На шаге 1 я записываю 8 байт. На втором шаге еще 8 байт. На третьем еще 8. В результате записал 24 байта. Потом читаю/проверяю первые 8 байт ... Так? Увы. В современных компъютерах все операции делаются блоками. Плюс к тому, между процессором и унешней памятью стоит cache. При любом чтении данных считывается вся строка cache, а, например, для процессора AMD K7/K8 это 64 байта. При записи несколько хитрее, но пока не суть. Значит, что происходит в нашем ущербном алгоритме в действительности?
|
|
| |
ivanna2004 | Дата: Суббота, 26-Фев-2011, 9:51:06 | Сообщение # 6 |
Подполковник
Группа: Администраторы
Сообщений: 113
Награды: 2
Репутация: 1
Статус: Offline
| Шаг 1 - запись 8 байт - данные попадают в cache и не записываются. Шаг 2 - данные кладуться в соседние ячейки той-же строки cache. Шаг 3 - аналогично. В результате в строке cache лежат наши данные. Шаг 4 - чтение/проверка. Гм, cache честно выдаст данные из себя, даже не запрашивая внешнюю память. Правда, хорошо работает тест памяти?? Ладно, положим, что cache посчитал, что действительно пора скинуть данные во внешнюю память, но его единица обмена = строка. И тут происходит 'странное' - идет запрос на чтение данных, которые мы не просили (остаток до 64 байт) и запись всех 64 байт в память. Похоже это на то, что мы думали о своем тесте - совершенно нет. Конечно, я несколько гипертрафировал проблему, но так всегда - пишем одно, а реально выполняется другое. Делать ли предвыборку? Ой, сложный вопрос. Для ускорения доступа к данным применяется prefetch - команда, аналогичная команде загрузки, но без вычисления и обязательной загрузки данных. Это команда не может вызвать GP, потому достаточно спокойно можно залезать вперед по адресам. Промажем мимо памяти, не беда. Эта команда всего-лишь посылает запрос в внешнее устройство (память) на получение данных. Сие очень удобно - я знаю, что мне позже потребуется новая строка данных, так тока я загружаю эту, могу запросить контроллер SDRAM и он загрузит эту информацию. Выходит, что prefetch очень полезна для тестов памяти? Увы, она ломает алгоритм теста. Контроллер SDRAM может или записывать или считывать, делать и то и другое одновременно он не способен. Команда prefetch заставляет контроллер перейти в режим чтения. А если в этот моент шла интенсивная процедура записи? Разорвется. Кроме того, prefetch есть запрос к контроллеру и при неудаче запроса (он пришел или слишком рано или уже поздно) это запрос будет уже мешать. От prefetch несколько повышается скорость, но падает эффективность. Я не использую. Взаимовлияние тестов. Запускаешь программу из двух тестов, ошибки начинают сыпаться сразу на начале второго теста. Логично предположить, что первый тест можно отключить, оставив только второй и тестирование будет проходить быстрее. Ага, запускаем тестирование и ... и ошибок нет. Только второй тест не находит ошибок! Существует явное и неявное взаимодействие тестов. Например, если перед тестом регенерации поставить что-то с интенсивным обменом данных, то матрица нагреется и вероятность ошибки будет больше. Увы, на этом 'явные' закономерности закончились. Неявные связи установить трудно, но они есть. Потому рекомендуется запускать тесты скопом, как сделал автор. Существует неявная связь в шаблоне данных. Тесты типа "бегущая 1", как правило, обладают не слишком высокой обнаруживающей способностью, но при их чередовании с 'псевдослучайными' сильно повышает эффективность обоих. Скорее всего, лео в локальных прогревах матрици. Еще из явно непредсказуемого - проверка памяти с замещенными строками (remap). Мы думаем, что проверяем соседние ячейки, а из-за remap эти ячейки лежат чер-те-где. Есть условно-явная зависимость - большенство тестов с выделенными стадиями записи и чтения/проверки работают лучше при нескольки повторах операции чтения/проверки. Например, установка в TM1 только одного повтора чтения существенно снижает обнаруживающую способность. Впрочем, одну явную закономерность могу привести сразу - если смешать кучу хороших тестов и запускать их по-очереди, то гарантирую ... как-бы помягче ... что это будет работать хуже самого худшего теста в связке. Тесты не смешивают. Mini FAQ Надо ли оптимизировать программу под различные типы SDRAM? Грубо говоря, SDRAM состоит из двух устройств - накопительной матрици и устройства ввода-вывода. Матрица у всех типов SDRAM примерно одинаковая и работает на одной и той-же частоте, примерно 200MHz: SDR 166-200MHz, матрица на 166-200 DDR 333-400MHz, матрица на 166-200, интерфейс на 166-200, данные по обоим фронтам. DDR2 667-800MHz, матрица на 166-200, интерфейс аналогичен DDR, данные передаются по два бита на выход (4 уровня) А вот тесты интерфейса как раз очень сильно зависят от типа. Например, в DDR2 данные передаются парами (см. ниже про отражения). Что такое 'тест матрици'? Данные лежат в заряде конденсаторов, когда соседние ячейки перезаряжаются или просто имеют противоположное значение к текущей ячейке, то заряд в этой ячейке начинает изменяться. Этот процесс зависит от интенсивности смены данных, их пространственного расположения и, естественно, температуры (кроме всего, тесты греют память, локально). Идея в том, чтоб дергать соседними битами и смотреть за неизменностью неизменных бит. Естественно, данные должны меняться во времени, поэтому тесты с фиксированным шаблоном крайне плохо тестируют матрицу. Кроме того, если используется не_линейная адресация, то крайне полезно использовать перемещение не кратно 2^n - матрица построена на разрядности 2^n и потому тестирование с 2^n будет менять одни и те-же выводы адреса (строки, столбци). Примерно из этих соображений строился тест, который я описал выше. В нем есть кратность трем, что точно не кратно 2^n. Что такое 'тест интерфейса'? Прямая противоположность тесту матрици, сильно зависит от типа SDRAM, разрядности и типа контроллера (да и процессора). Немного теории - современные шины данных работают с высокими скоростями и их можно рассматривать только как длинные линии. При передаче сигнал обязательно отражается на конце линии и возращается обратно. В результате форма сигнала искажается. Для компенсации этого зла на конце линии ставят согласующее сопротивление, равное импедансу линии и помехи уменьшаются. Степень уменьшения помех зависит от разводки печатной платы, контроллера и микросхем памяти. Шина состоит из множества проводников и они мешают работе друг-друга. Это значит, что надежность считывания данных зависит от того, что передается в соседних разрядах шины данных - это смещает уровни. Из-за не полностью скомпенсированных отражений на текущие данные влияет то, что передавалось до этого. Тест интерфейса состоит в правильном подборе данных так, чтоб в соседних линиях и предыдущие/последующие данные формировались нужным образом. Например, тест "бегущая 1" установит почти все линии в 0, что неизбежно вызовет смещение уровней к нулю и тот бит, на котором выставлена 1 будет смещен вниз. Это может породить сбой. Отмечу один момент - совершенно не обязательно, что совпадают номер бита данных и вывод шины данных на печатной плате (и DIMM). В пределах байта они могут быть перепутаны, как и сами байты (группы по 8 бит) между собой. На функционирование модулей памяти это не сказывается, а вот с тестирование возникают сложности. Все фирмы, как правило, пытаются делать прямое соответствие, кроме ASUS. Эти продолжают, sorry, выеживаться. Из-за этого их матплаты могут работать неустойчиво на некоторых модулях памяти - ведь DIMM тестируют на оборудовании с прямым соответствием данные-шина и перемешанная выборка может снизить надежность. (несовместимость памяти и матплат). На чем писать тест? Сложно сказать, я пишу на asm. если серьезно - пишите на чем угодно, только обеспечте максималную скорость работы теста! Медленный тест точно ничего не найдет. Можно использовать обычные команды процессора, через FPU, MMX или SSE - в любом случае данные идут через один и тот-же блок ввода-вывода процессора. Крайне не рекомендую использовать SSE на AMD K7/K8 - у них внутренняя шина данных 64 бита и, похоже, одинарная команда SSE рассыпается на две по 64 бита. В результате скорость падает ниже, чем у аналогичной MMX. На процессорах Intel лучше примять SSE. Кроме того, для обхода вредоностного действия cache можно использовать команды прямой записи, минуя cache. Кроме всего прочего, это еще и повышает скорость в несколько раз. (см. BenchMem)
|
|
| |