Professional Documents
Culture Documents
Процесни компјутери
Семинарска работа
Ментор : Изработил :
2
9.3.10. Преглед на микропаралелизација....................................................................................63
9.3.11. Програмирање за пропусност...........................................................................................67
10. Симулација, верификација и подигнување на системот...........................................................68
10.1. Модел на SPARC архитектура...................................................................................................69
10.1.1. SPARC CPU модел...............................................................................................................71
10.1.2. VCPU интерфејс..................................................................................................................71
10.1.2.1. Контролен интерфејс......................................................................................................72
10.1.2.2. Системски интерфејс.......................................................................................................73
10.1.2.3. Интерфејс за следење.....................................................................................................73
10.1.3. ММI.....................................................................................................................................74
10.1.3.1. SAM конфигурациски фајл..............................................................................................75
10.1.3.2. Вчитување и (вадење) бришење на модул...................................................................75
10.1.3.3. Подигнување на модул...................................................................................................76
10.2. Системски конфигурациски фајл..............................................................................................77
10.2.1. Формат на sysconf наредбата............................................................................................77
10.2.2. Примери.............................................................................................................................79
10.2.3. Симулирано време во SAM...............................................................................................80
10.3. SAM Huron Sim архитектура.....................................................................................................82
10.3.1. Пример за конфигурациски фајл за T2 Huron на SAM...................................................83
10.3.2. Модул за сериски уред......................................................................................................86
10.3.4. PIU модул...........................................................................................................................90
10.3.5. IORAM модул....................................................................................................................92
10.3.6. Модул за време од денот...................................................................................................94
10.3.7. PCI-E Bus модул.................................................................................................................95
10.3.8. PCIE-PCI Bridge модул......................................................................................................97
10.3.9. PCIE-PCIE Bridge модул...................................................................................................99
10.3.10. Сериски прикачен SCSI модул.....................................................................................101
10.3.11 LLFS модул.......................................................................................................................103
10.5. Дебагирање со SAM................................................................................................................106
10.5.1. Пристап до симулирани состојби...................................................................................108
10.5.2. Информација за симболи................................................................................................110
10.5.3. Точки на прекин...............................................................................................................112
3
10.5.4. Следење на дебагирање.................................................................................................113
10.5.5. Сонди................................................................................................................................114
10.6. Симулација со точни циклуси................................................................................................115
10.6.1. Пристап со следење.........................................................................................................115
10.6.2. Пристап базиран на извршување...................................................................................116
10.6.3. Пристап со подмодули....................................................................................................117
10.6.4. Заклучок............................................................................................................................117
10.7. Верификација со косимулација.............................................................................................117
10.7.1. RTL косимулација.............................................................................................................118
10.7.1.1. TLB-Sync модел............................................................................................................120
10.7.1.2. LdSt-Sync модел............................................................................................................122
10.7.1.3. Follow-Me модел...........................................................................................................125
10.7.2. RTL-SAM косимулација....................................................................................................126
4
8. ОПЕРАТИВНИ СИСТЕМИ ЗА OPENSPARC T1
Со зајакнувањето на евтините хардверски системи, употребата на хардверскиот
систем стана проблем кај некои апликации. Виртуелизациската технологија дозволува
консолидација на апликации кои работат на повеќе неискористени хардверски системи
во еден хардверски систем. Повеќето хардверски системи со се консолидирани треба
да работат со различни верзии на ист оперативен систем или на различни оперативни
системи. Виртуелизациската технологија го оддвојува оперативниот систем од
хардверскиот систем и дозволува повеќе OS околини (Solaris, Linux, Windows, etc.) да
работат на еден хардверски систем.
Оваа точка дава детали за виртуелизацијата на OpenSPARC T1 OS преку
следните потточки:
• Виртуелизација
• sun4v архитектура
• Додатоци на SPARC процесорот
• Портирање на оперативни системи
8.1. Виртуелизација
5
8.2. sun4v архитектура
6
OpenSPARC, покрај поддршката за виртуелни адреси (VA) и физички
адреси (PA), поддржува и реални адреси (RA). MMU поддржува RA-во-RA
поместување покрај VA-to-PA поместувае. MMU не поддржува VA-to-RA хардверски
поместување.
Физичката меморија во виртуелниот систем е опишана со реална адреса.
Гостинскиот OS пристапува до меморијата или директно со реални адреси или преку
виртуелни адреси мапрани за реални адреси. Кога гостинскиот OS бара од
хипервизорот да постави VA-to-RA MMU мапирање (преку Hypervisor API повик ),
хипервизорот ја преведува RA во физичка адреса на меморијата алоцирана за
виртуелниот систем. Потоа хипервизорот поставува VA-to-PA MMU мапирање. MMU
чува PID на виртуелниот систем во TLB влез заедно со VA, PA и други информации.
Овој TLB влез не е придружен за виртуелен систем кој го внесил мапирањето. Кога
софтверот кој работи на виртуелен систем прави мемориски операции, MMU
поместувањата се совпаѓаат само на оние TLB влезови кои имаат ист PID како и PID
зачуван во регистерот за партициски идентификатор на CPU. Притоа, виртуелен
систем не може да пристапи до ресурси (меморија, мемориски мапирани I/O регистри
итн) мапирани од TLB влезови на друг виртуелен систем. Кога виртуелен систем е
активен, еден од CPUата алоциран на виртуелниот систем е препознаен како CPU за
подигнување и започнува со покревање на гостинскиот OS.
Најверојатно гостинскиот OS го чита описот на машината на својот
виртуелен систем и почнува друг CPU во виртуелниот систем. Гостинскиот OS има
барање за хипервизор преку Hypervisor API повици за стартување на CPU алоциран за
неговиот виртуелен систем. Пред CPU да започне со софтверот за извршување во
виртуелниот систем, хипервизорот иницијализира PID регистер на CPU до PID на
виртуелниот систем. Hypervisor API исто така поддржува повик за испраќање на
прекин од еден CPU до друг во рамки на виртуелниот систем.
OS може да пристапи до I/O регистри преку барање на хипервизор за сетирање
на MMU мапирање од виртуелна адреса на гостински OS на физичка адреса на I/O
уред. Двигател на уред запишан на DDI/DDK интерфејс не треба да се менува за да
работи на OpenSPARC систем.
7
8.4. Портирање на оперативни системи
8
9.1.1. Компајлирање апликации со Sun Studio
9
фајлови во С++, -g знаменцето ќе оневозможи функциско порамнување. За С++
кодови, се препорачува да се користи –g0 наместо –g; ова знаменце генерира
информација за дебагирање, но исто така овозможува порамнувачки оптимизации.
Кога не е специфицирано знаменце за оптимизација, компајлерот не
изведува оптимизација; ова обично резултира во код кој работи поспоро од
очекуваното. –О оптимизациското знаменце обично претставува добар компромис
помеѓу времето на компајлирање и брзината на новиот код, па обично е добар почетен
чекор за оптимизација.
Макро знаменцето –fast овозможува опсег на компајлерски оптимизации кои
обезбедуваат добра брзина кај повеќето апликации. Меѓутоа, ова знаменце не е добро
за сите апликации бидејќи прави одредени претпоставки за однесувањето на
апликацијата:
10
кажува на компајлерот да претпостави дека системот кој ја прави
апликацијата исто така е систем на кој апликацијата работи. Во некои
случаи, оваа претпоставка може да доведе до извршувања кои ќе
работат споро (или воопшто нема) на други системи. Ова однесување е
причина за следење на – fast со знаменце -xtarget=generic, кое прави
враќање назад и му кажува на компајлерот на изгради код кои ќе
работи на широк опсег од платформи. Компајлерот оценува знаменца
од лево на десно, па така знаменцата поставени подоцна во наредбата
ќе надвладеат на оние поставени порано.
11
GCC за SPARC поддржува оптимизациски карактеристики на компајлерот Sun
Studio како што се повратна информација за профилот, оптимизација помеѓу
фајловите, автоматска паралелизација, бинарна оптимизација, детекција на податочни
трки и друго. Овие карактеристики се дискутирани подоцна.
12
9.1.3. Подобрување на брзината со профилна повратна информација
13
Профилната информација бара некои компајлерски знаменца (со исклучок на
знаменцето -xprofile) да се користат и за инструментирани и за крајни верзии на
апликацијата. –xprofile знаменцето исто така како параметар ја зема
локацијата на фајлот каде се чуваат податоците од тестното
оптоварување. Се препорачува овој фајл да биде специфициран;
спротивно, компајлерот може да не биде во состојба да го лоцира
податочниот фајл.
Неколку проблеми околу употребата на профилната информација
треба да се спомнат:
14
9.1.4. Вградување оптимизација низ фајл
Постојат и проблеми:
• Големината на кодот кој се распоредува е зголемена, што може да резултира со
голем број на активни регистри, што пак може да доведе регистрите да се отфрлени
од меморијата.
• Влијанието на меморијата врз рутината ќе се зголеми и ова може да доведе до
поголем притисок на кешовите. Ако се покаже дека вградениот код не бил
неопходен, рутината која еднаш ја собирало во кешот веќе нема да може да ја
собере.
15
9.1.5. Избор на големина на TLB страница
16
прикажува излез од оваа наредба при извршување на a.out.
17
Алатката која собира профилни информации се нарекува collect. Ова алатка
може да биде прикажан на процес кој работи преку collect -P pid или може
да го следи целосното работење на апликацијата со собирање на апликациски
параметри. Податоците за профилот се собираат во директориум на кој му е
преддефинирано име test.l.er. Двете алатки може да прикажат собрани
податоци: алатката за наредбата наречена er_print или GUI алатка
наречена анализатор. Двете алатки треба да се подигнати со името на
експериментот кој е вчитан. Верзијата на алатката со наредба исто така
може да биде вклучена преку команди кои се извршуваат или со скрипта.
Чекорите неопходни за градење, работа и преглед на профилот во
GUI од кодот во 9-4 се прикажани во примерот за код 9-5.
18
Првичниот преглед на профилот е прикажан на слика 9-1.
19
СЛИКА 9-2 Информација за повик на стек
20
знаменцето –h, заедно со листа на бројачи кои го користат. Примерот за код 9-6
прикажува инструкции потребни за профил на апликацијата да лоцира места во кодот
каде постојат промаршувања на податочниот кеш; промаршувањата на податочниот
кеш се снимани од бројачот DC_miss.
21
sum и main. Пак двете колони колони покажуваат инклузивно и ексклузивно
корисничко време. Рутината main има два повици до други рутини и овие повици
имаат инклузивно време својствено за нив, но немаат ексклузивно време (бидејќи
инструкцискиот повик има време 0).
22
го собира времето својствено за сите расклопувачки инструкции кои се генерирани од
таа изворна линија.
23
повикување на рутина, веројатност на извршување на гранка и други корисни мерки.
По инсталацијата на BIT, тој може да се покрене директно, или уште подобро,
преку вклучување на collect –с. За BIT да работи, апликацијата мора да се компајлира
со оптимизација и компајлира и поврзе со компајлерско знаменце -xbinopt=prepare
за компајлерот да ги снима потребните анотации. Примерот за код 9-7
покажува пример за компајлирање и собирање на броења на извршувања
за пример во програм.
24
Последната колона на податоци покажува анулирани инструкции. Анулираните
инструкции се инструкции кои биле поставени во местото за доцнење на гранката. Тие
се извршуваат доколку се тргне по гранката, но доколку не се тргне по неа,
инструкциите се анулирани.
Податоците за броење на инструкции исто така се постапени на расклопувачко
ниво, како што е прикажано на слика 9-7. Може да се види дека јамката на адресите
0x10cd0 до 0c10d00 е внесена 10 пати и има средно броење на пат од 2 и пол милиони
итерации секогаш кога е внесена. Бидејќи кодот е компајлиран со оптимизација,
компајлерот има одмотано јамка 4 пати, како што може да се види од четирите faddd
во јамката.
25
СЛИКА 9-8 Информација за фреквенција на инструкциски типови за BIT
26
Како што се гледа на примерот 9-8, BIT прво се вклучува за да генерира
инструментирана верзија од апликацијата. BIT користи анотации за снимање под
-xbinopt=prepare за да ја расклопи апликацијата и да генерира нова
верзија од бинарностите кои содржат инструментиран код. Оваа
инструментирана апликација е таа со која мора да се работи. На крајот на
циклусот на инструментираните бинарност, податочен фајл е креиран кој
содржи резултати од инструментацијата. Потоа BIT се вклучува за да го
анализира овој податочен фајл.
BIT може да инструментира само делови од кодот кој е компајлиран
со -xbinopt=prepare . Ако апликацијата има повеќе фајлови со и без оваа
опција, тогаш известувањата за податоците од страна на BIT се собрани
само од инструментираниот делови. Ако инструментиран код повикува во
неинструментирани библиотеки, тогаш овие библиотеки исто така се
исклучени од анализата.
BIT исто така може да генерира извештај за покриеност кој
покажува на код кој бил извршен. Исто така може да генерира извештај
наречен извештај на непокриеност. Идеата на непокриеност е да испита
повикувачки стек на рутини како и да одреди дали тие се извршени или
не. Алатката може да одреди некоја рутина, која доколку е извршена,
исто така доведува други неизвршени рутини да се користат. Со оваа
27
анализа, може брзо да се развијат тестови кои ќе погодат одредени
делови од кодот, знаејќи дека овие тестови сигурно ќе ги извршат
непокриените рутини. Извештајот за покриеност може да се генерира од
BIT, како што е прикажано на примерот 9-9. Анализирачката опрема, која
содржи и репорти на покриеност и непокриеност, исто така се генерира.
28
Најслабата точка е воочена кога тренинг оптоварувањето беше од друг тип на
проблем а не поради оптоварување употребено при работа на тест платформата.
Методологијата е детално објаснета на ://developers. sun.com/
solaris/articles/coverage.html. Прегледот е следен. Бинарностите се компајлирани со
знаменце -xbinopt=prepare. Компајлираните бинарностите се инструментирани со BIT,
и потоа се генерирани извештаи за тренинг оптоварување и за реалното оптоварување.
Едноставна програма е прикажано како што е наведено во примерот 9-10.
29
ПРИМЕР ЗА КОД 9-12 Броење на основни блокови
30
блиску 0 значи дека ниту една од често извршуваните гранки не е точно предвидена.
За примерот, постојат две гранки. Првата гранка е предвидено да не се изврши
од тренинг оптоварувањето и не е извршена од референтното оптоварување; таа се
извршува еднаш од референтнното оптоварување. Втората гранка исто така е
предвидено да не се изврши од тренинг оптоварувањето но е извршена од
референтното оптоварување. Втората гранка е сретната 4 пати од регерентното
оптоварување. Така пресметката кажува дека една точно предвидена гранка извршена
еднаш од референтното оптоварување и 4 неточно предвидени гранки изврпени до
референтното оптоварување, па согласно квалитетот на предвидувањето е (1 x 1 + 0x4)
+ 5 = 0.2. Така тренинг оптоварувањето е со слаба совпадливост за однесувањето на
гранката на реалното оптоварување.
Пресметката за договор помеѓу фреквенцијата на динамичко извршување на
основни блокови е малку различна. Веројатноста за гранка која е извршена има опсег
од 0 до 1, но не постои еквивалентна горна граница на фреквенција за извршување на
основен блок.
Меѓутоа, една мерка која може да јасно да се дефинира за основен блок е тоа
дали тренинг оптоварувањето ги покрива сите блокови кои се важни за реалното
оптоварување; пред се, доколку оптоварувањето не изврши блок, тогаш компајлерот
може да не добие информација за однесувањето на блокот. Блокот се смета за покриен
се додека тренинг оптоварувањето го извршило блокот барем еднаш. Ако блокот
никогаш не се изврши од тренинг оптоварувањето, тогаш блокот се смета на
напокриен.
Вредност помеѓу 0 и 1 може да се пресмета преку сумирање на бројката за
динамичко извршување на оние основни блокови во реално оптоварување кои се
покриени со тренинг оптоварувањето и делење на тоа со бројот на динамички
извршувања на сите основни блокови во реално оптоварување. Вредност блиску до 1
значи дека сите често извршени основни блокови во реално оптоварување се исто така
извршени барем еднаш од тренинг оптоварувањето. Вредност блиску 0 значи дека ниту
еден блок кој е често извршуван во реално оптоварување не е покриен со треминг
оптоварувањето. Во примерот, тренинг оптоварувањето ги извршува сите основни
блокови во референтно оптоварување, па така се добива квалитет на покриеност на
основни блокови од (1 + 1+ 4 + 1) + 7=1.0. Тренинг оптоварувањето добро се
31
совпаѓа со референтното оптоварување.
Добро е да се воочи дека иако овие мерки се приближни за квалитет
на тренинг оптоварување, исто така е можно да се направи компромис
помеѓу тренинг и реалните оптоварувања на график. Примери за графици
со скрипти кои процесираат резултати од BIT се достапни на:
http://developers.sun.com/solaris/articles/coverage.html.
32
информации бара привилегии на супер корисник.
$ spot -X a.out
33
Делот на почетокот на ripc излезот пресметува број на иагубени циклуси на
секој тип на процесорски настан. За овој код, околу 1/3 од работата е изгубена во
настани на промаршување на податочен кеш. Околу 40% од вкупната работа се троши
во циклуси на чекање. Ripc исто така следи вкупни времиња, броења инструкции и
операции со подвижна запирка. Тој исто така следи и број на стапици за подвижна
запирка низ целиот систем кои се случуваат додека апликацијата работи. Овие стапици
се направени кога процесорот има потреба операциите со подвижна запирка да се
извршат во софтверот. Оваа алатка исто така следи и големина на меморија и го чита
искористувањето на опсегот.
34
9.2.5. Дебагирање со dbx
Да го разгледаме кодот од пример 9-17. Овој код има грешка на меморијата која
се користи без да биде алоцирана.
35
на овој фајл.
36
Во овој случај, компајлерот не може да одреди точна линија на изворен код кој
довела до проблемот. Тој ја одредува рутината точно. Со поглед кон расклопувањето
на рутината со dis наредбата се покажува дека проблематичната инструкција е clr
(clear) инструкција на 0x10ba8.
Бидејќи рутината е кратка, важно е да се погледне дека %o0 содржи вредност на
а која била пратена во рутината и дека %o5 содржи индекс во тоа поле. Наредбата regs
ги печати тековните вредности на регистрите и покажува дека %o1 содржи вредност 1,
%o5 содржи 8 (што е 1 помножено со големината на елемент на полето, и секоја двојка
зема 8 бајти) и %o0 содржи 0x1070c— исто вредност како и неоптимизараната
ситуација.
Исто така е можно да работи програмот под dbx. Во тој случај, dbx мора да
прати име на извршувач како параметар на командната линија, како што е прикажано
на неоптимизиран код во примерот 9-20. Ако апликацијата бара некакви параметри на
командната линија, тие може да се постават со runargs наредбата во dbx.
37
9.2.6. Употреба на Discover за лоцирање на грешки во меморискиот пристап
38
9.3 Пресметување пропусност
OpenSPARC T1 и OpenSPARC T2 процесорите имаат повеќе канали кои делат
јадро, и како такви се дизајнирани за оптоварувања кои бараат поголема пропусност
наместо кратко време на одзив. Најчест начин на илустрирање зошто повеќето канали
може да делат јадро покажуваат јазовите кои се јавуваат во протокот на инструкции од
настани како промаршувања на кеш и демонстрираат дека овие јазови треба да се
користат од други канали за да направат прогрес. Ова може да биде изразено со сите
канали ќе имаат циклуси на чекање, и овие циклуси се доволни да обезбедат промена
на различни канали. Следните подточки прават преглед на развојот на апликации кои
користат повеќе канали:
39
9.3.1. Мерење на искористеност на процесорот
40
Corestat добро го опфаќа и cpustat, која следи процесорски настани на целиот
систем. Може да се бројат разни хардверски настани и добро е да се прегледаат
информациите кои ги нудат тие настани. Примерот 9-23 покажува повеќеканален
програм кој може да се користи за испитување на брзината на инструкциски проблеми.
41
Компајлерското знаменце –xopenmp прави компајлерот да препознае OpenMP наредба
во кодот. Знаменцата -xloopinfo и –xvpara прават компајлерот да даде повеќе
информации за паралелизмот на кодот.
42
Излезот покажува дека секоја канал извршил околу 188М инструкции во
секунда. UltraSPARC T1 системот кој ги генерира овие податоци има 4 канали на
секое јадро. Со земање на ID 0, 1, 2, i 3, на виртуелен CPU , кои лежат на првото
јадро, вкупниот број на извршени инструкции од тоа јадро е 750М; за 1.2 GHz
процесор ова е 750 + 1200 = 65% искористеност.
43
Согласно, секој канал поседува т.н. „буџет за чекање“ кое е три пати од
„инструкцискиот буџет“. Се додека бројот на циклуси за кој каналот е закочен не го
надмине овој буџет, каналот ќе продолжи со праќање инструкции со најголема брзина.
44
состојба е да се помножи бројот на настани на со трошокот на тој тип на настан.
Доста е лесно да се користат cpustat или cputrack за да се соберат фреквенции на
разни настани за време на работата на апликацијата. Потоа ова може да се комбинира
за да се добие пресметка на вкупниот број на потрошени циклуси во состојби на
чекање. Податоците се сумирани за кодот во примерот, кој работи на 1.2 GHz
UltraSPARC T1 систем, во табела 9-4. Важно е да се увиди дека пресметките за
трошоците на разни настани се само пресметки а не се точни мерења. Меѓутоа, ова не
му штети на пресметката на трошоци за разни настани – јачината на пресметките се
користи и за точни вредности.
45
miss L2 cache
Data cache load L2_dmiss_ld 1,015,218,197 84
misses that also 100
miss L2 cache
65,284,655,74
Instruction count Instr_cnt 4 7 217s
46
намалување на бројот на инструкции.
47
9.3.3. Собирање на податоци за броење инструкации
48
- Повеќе канали. Повеќеканалната апликација е единечно извршување кое се
бројни канали кои ја извршуваат работата. На веб сервер, секој канал може
да е задолжен за работа со новите барања за страници кои доаѓаат. Во
посложен систем, на секој канал може да му се даде одделна задача. Кај
појаки оптоварувања, секој канал може да пресметува дел од проблемот.
Бидејќи сите канали делат иста меморија, постои загриженост дека грешка
кај едно од овие канали може да доведе до пад на цела апликација. Постојат
два можни начини на кодирање на повеќеканални апликации, PThreads и
OpenMP, и двете се опишани подоцна.
- Повеќе системи. Можно е да се распредели апликацијата помеѓу
повеќе системи. Во некои ситуации ова може да се постигне со
реплицирање на еден извршувач и инсталирање на повеќе системи,
потоа поставување на овие системи зад некаков тип на механизам на
контролирано читање – ова е типично за хостирање на големи веб
страни – со бројни системи кои работат на идентичен софтверски
стек.
49
9.3.5. Паралализам на апликации со POSIX канали
50
комбинирана со libc, па така не треба да се поврзува во libpthread. Чекорите за
компајлирање и работа на апликацијата на Solaris 10 платформа се покажани во
примерот 9-27.
51
избирајќи само делови на апликацијата кои ќе го подобрат паралелизмот и
ќе го остават остатокот од апликацијата недопрен.
Посложен пример е прикажан во кодот од 9-30. Овој код содржи две паралелни
52
области; првата е јамка која поставува содржина од вредности на поле; втората
паралелна област е намалена.
53
9.3.7. Употреба на автопаралелизам за добивање на паралелни апликации
54
9.3.8. Детекција на податочни трки со анализатор на канали
Податочна трка се случува кога два (или повеќе) канали се обидат да пристапат до
иста мемориска локација во исто време и едниот или повеќе од овие пристапи е
запишување. Како едноставен пример, да разгледаме два канали. Двата канали ќе
читаат, инкрементираат и запишат иста вкупна променлива total. Низата на операции е
прикажана на кодот од примерот 9-33. Се забележува дека променливата total е
декларирана како погрешна, што го стопира компајлерот од задржување на
променливата во регистар и гарантира дека променливата е вчитана од меморија пред
да се инкрементира и зачува назад.
ПРИМЕР ЗА КОД 9-34 Компајлирање и работа со код кој содржи трка на податоци
55
Иако двата канали се обиделе да инкрементираат вредност, само еден од
инкрементите всушност е сниман. Најчесто со многу грешки во меморијата, овој
проблем е тешко да се детектира бидејќи резултатот на грешката најверојатно ќе се
детектира далеку од локацијата на грешка во кодот.
За среќа, Sun Studio 12 вклучува анализатор на канал, кој детектира и известува
за грешки во повеќеканалниот код. За употреба на алатката, мора да се компајлира
кодот со компајлерско знаменце flag -xinstrument = datarace, кое кажува компајлерот да
вклучи неопходни инструменти за снимање на грешки. Се препорачува исто така да се
вклучи знаменце –g. Кодот потоа се пушта под collect со опција –r вклучена. Овие
чекори се прикажани на примерот 9-35.
56
СЛИКА 9-9 Податочни трки прикажани во Thread Analyzer GUI
57
онаа која се завршува како да била единечна операција; тоа значи, никој друг канал не
може да ја интерпретира или расипе операцијата. Solaris 10 има код за голем број на
атомски операции вклучени во libc. Опсегот на поддржани операции може да се најде
под man atomic_ops.
Следната точка ги испитува трошоците од различните методи на делење на
податоци помеѓу каналите.
Второто решение да податочните трки е да се реархитекурира кодот така што
податоците не се делат помеѓу каналите. Предност на овој пристап е тоа што избегнува
синхронизациски кодови, но ова избегнување не е секогаш можно да се достигне во
пракса.
58
Низата на компајлирање и работа на кодот е прикажана на примерот 9-37. Кодот
дава точен одговор од 200000.
ПРИМЕР ЗА КОД 9-37 Compiling and Running Code Containing a Mutex Lock
59
T2000
60
Разликата во брзината кај Т2000 е импресивна. Двоканалната верзија на кодот
завршува за околу 0.8s. Интересно, двоканалната верзија изведува двојно повеќе
работа за исто време, но користи двојно подолго корисничко време. Атомските
операции се поисплатливи отколку добивање и пуштање на mutex, што води кон многу
подобро скалирање. Секако, SMP систем ќе нема доволно брзина од употребата на
атомски операции бидејќи нивното делење треба да се направи низ меморијата. Две
директиви во OpenMP се справуваат со истата ситуација. Кодот од примерот 9-39
прикажува OpenMP код кој содржи податочна трка. Овој код има две јамки кои се
паралелни за OpenMP. Првата јамка поставува поле а втората пресметува сума на сите
вредности во полето.
61
Двете директиви може да се користат за избегнување на ситуација на податочна
трка. Првата е наредба на критичен дел. Оваа наредба одредува дел од кодот кој треба
да се изврши на само еден канал истовремено. Променетиот код е прикажан на 9-41.
Кога кодот работи, тој дава точен одговор и во сериски и во паралелен случај.
Овој код е аналоген на употребата на mutex заклучување за заштита на пристап до
променливата total. Меѓутоа, поефикасна наредба може да се користи во оваа
ситуација. Тоа е атомска наредба, која одредува дека следната операција е иаведена
автоматски. Кодот кој ја користи оваа наредба е прикажан на 9-42.
62
9.3.10. Преглед на микропаралелизација
63
може да биде покажан со повеќе индекси чување во индексното поле. Овој пример е
еден вид на редукција, па та атомската операција add може да се користи за да се
избегне потенцијална податочна трка. Микропаралалеизмот треба да ја изведува истата
задача, иако со доволно пречекорување. Целта на примерот е да прикажен структура
наместо потенцијални подобрувања во брзината.
ПРИМЕР ЗА КОД 9-43 Код кој содржи можни зависности помеѓу итерациите
Прва работа која секој канал треба да ја направи е да одреди која итерација е
одговорна за пресметување. Еден начин за тоа е прикажан на примерот 9-44.
64
Кодот од примерот креира два канали. Тој користи променлива која ги задржува
каналите се додека двата не се креирани и работат. Откако двата канали работат, тие
работат низ главната јамка, и секој се обидува да појде на следната интерација.
Атомската инструкција Compare and Swap (cas) гарантира дека само едниот канал ќе ја
извршува секоја итерација. Откако каналот добие право да изведи одредена итерација,
тој повикува do_iteration routine за да изврши работата. Рутината do_iteration routine е
прикажана на примерот 9-45.
65
Кодот кон не работи мора прво да провери дека нема итерации кои ја користат
вредноста на индексот за таа итерација. Откако овој тест ќе помине, кодот изведува
сигурна пресметка со знаење дека ниту еден друг канам нема да чита или промени
елемент кој се пресметува.
Еден краен дел од кодот е потребен за иницијализација на индексните полиња и
вредности. Ова е прикажано на примерот 9-46. Кодот слободно сетира поле на индекси
за да покаже само првите 8 елементи од полето со вредности.
66
9.3.11. Програмирање за пропусност
67
10. Симулација, верификација и подигнување на системот
SPARC Architectural Model (SAM) е флексибилна, реконфигурабилна виртуелна
платформа за системска симулација. Таа дозволува корисниците да моделираат
различни SPARC системи. Виртуелната платформа има важна улога за системски
испитувања, софтверско подигнување и развој кога новиот хардвер е подготвен –
корисниците може да пуштат софтвер на симулиран систем дури и кога хардверот не е
достапен. Виртуелната платформа може да подигне Open Boot PROM (OBP) и Solaris
опративен систем и да креира околина многу слична со онаа креирана од реалниот
хардвер.
68
10.1. Модел на SPARC архитектура
69
SAM може да управува со време на симулација низ сите хост машини. Тој
имплементира редица на настани за да следи кога податоците од симулираните уреди
треба да се процесираат. Типична симулациска брзина е околу 6-10 MIPS.
SAM поддржува можност за отфрлање/враќање на системот. Симулацијата
може да се стопира во секое време за да се креира точка на проверка. Подоцна,
симулацијата може да се врати и започне од таа точка. Оваа карактеристика е корисна
за брз рестарт после долго подигнување и исто така за дебагирање.
SAM има вграден кориснички интерфејс (UI) базиран на едноставен и лесен за
употреба команден јазик. Тој има богато множество на основни наредби, на пример,
run и stop за симулациска контрола, break за да постави точка на прекин, read-reg за да
испита регистарски фајл. UI исто така поддржува скрипти напишани во Python.
Забелешка Python е избран бидејќи тој е моќен, портабилен, отворен, јазик со јасни
скрипти, и поддржува објектно-ориентирано програмирање, има пристап до голем
број на вградени и надворешни библиотеки и има лесен интерфејс за код напишан
во С или С++.
Забелешка: Важно е да се спомене дека SAM модулот не треба да биде реален уред.
Некои други симулациски компоненти, на пример, модулот за трагање,
дополнителни UI наредви, модел на време и слични треба да се добро
имплементирани како динамички вчитани библиотеки.
70
• Device model interface (MMI)
71
• Системски интерфејс (меморија и I/O)
• Интерфејс за следење
Забелешка
Интерфејсот до модул за вчитување се состои од два елементи: извадени и
вметнати (увезени/извезени) интерфејси
72
Откако vcpu инстанцата е креирана, VCPU методите може да пристапат до
состојба на таа инстанца. Контролниот интерфејс има методи за читање и запишување
на регистарска состојба, n број на инструкции или циклуси на напредна симулација,
точки на прекин за поставување и бришење, преведена адреса во моменталната vcpu
содржина итн.
VCPU контролниот интерфејс дозволува корисниците да фатат надворешен
дебагер на системско ниво или модул на кориснички интерфејс.
73
комплетна информација за примени во состојбата на архитектурата при секоја
инструкција.
Информацијата за секоја инструкција се собира во специјална
инструкциска структура која ги акомулира промените на вредностите на состојбата за
секој VCPU. Одделна структура собира информации за стапици и обновувања на TLB.
10.1.3. ММI
• Пристап до меморија
• Сигнализирање на прекин
74
• Мапирање на делови од просторот на I/O физички адреси
• Мапирање на некои специфични ASI регистри
75
да се извадат во секое време. Секој модул е известен кога друг модул менува статус. За
да се овозможи комуникација мешу модулите, секој модул треба да добие извезен
интерфејс – покажувачи до интерфејс рутини. Кога модулот се вади, други модули
треба да примат соодветена нотификација на конфигурациска промена и да ги
отстранат нивните покажувачи до извадениот модул.
76
10.2. Системски конфигурациски фајл
Каде
77
или опционален. Неговата бредност може да биде булова (значи дали постои или не
вредност на параметрот) или може да има arg_value.
• arg-value — Дел од вредноста на парот name=value на конфигурацискиот
параметар на модулот. Семантиката и легалните вредности на arg-value се
дефинирани од одреден модул. На пример, конзолен модул може да поддржи
конфигурациски параметар bg_color. Корисникот може да постави вредност на овој
параметар на валидна вредност, како што е црна. Ова ќе се појави во линијата на
sysconf наредбата како bg_color=black. Конфигурациските параметри и нивните
валидни вредности се разликуваат од модул до модул и се дел од документацијата
специфична на модулот. Конфигурациските параметри се интерпретирани од
индивидуални модули
• ddebug-level — опционално знаменце за дебагирање поддржано од одреден
модул. ddebug-level може да биде 0, 1 или 2, со 0 исклучен (исто како –d да не е
присутно) , 1 (verbose), и 2 (verbose++). Семантиката на нивото и дадената
информација се разликуваат од модул до модул. Обично модулот ќе извезе UI
наредба која може да ја промени вредноста на знамето за време на работата.
• mod-path —Во вообичаена SAM инсталација, модулите се сместени во install-
dir/lib директориум и SAM бинарностите во install-dir/bin. SAM ги заклучува
модулите во $ORIGIN/../lib. Меѓутоа, корисникот може да одреди сопствено место
пример -p mod-path, каде SAM ќе погледне прво во mod-path за модули. Секоја
sysconf –p додава патека за проверка, прегледана во LIFO редослед, и последната е
$ORIGIN/../lib. Се препорачува да се користи првичната патека за проверка.
Забелешка
Спецификацијата за наредбата sysconf за CPU е малку различна. mod-name
секогаш е cpu. arg-value od arg-name cpu типот одредува CPU библиотека за
вчитување. На пример, T2 CPU е конфигуриран како
78
10.2.2. Примери
79
10.2.3. Симулирано време во SAM
80
Така, најмалата единица на симулирано време во SAM е 1 микросекунда. На
пример, ако mips=M и stickfreq = N, SAM извршува M инструкции пред да го
инкрементира STICK регистарот за N/106. Ова е 1 микросекунда во
симулацијата.
81
10.3. SAM Huron Sim архитектура
82
СЛИКА 10-1 Преглед на главни компоненти на Huron SAM симулациска
платформа
83
симулирана меморија и име на директориум каде може да се најде модул за уред.
После тоа, секој модул за уред е конфигуриран од одделна sysconf линија. На крај,
sysconf линиите опишуваат стебло на уреди на Huron систем.
84
ПРИМЕР ЗА КОД 10-2 Пример за конфигурациски фајл за T2 Huron на SAM
85
10.3.2. Модул за сериски уред
Каде
- Base е почетна адреса на мемориски мапирана адреса на CSR на уредот
- Size е големина на CSR простор за овој уред.
- Log e опционален булов аргумент кој дозволува логирање на влезови и
излези на конзолата. Ако аргументот дава filename аргумент тогаш конзолата
е логирана во filename. Ако filename не е дадено, тогаш лог фајлот е serial-
instance-name.log. Фајлот се отвора во опаѓачки режим па така претходните
содржини не се губат за време на повеќето пуштања.
- Pop е опционален булов аргумент кој, доколку е понуден, доведува до xterm
86
прозорец, со tip својство кое веќе работи на него за да го вклучи при старт.
DISPLAY променливата треба да се постави соодветно за ова да работи
точно. Ако pop не е присутен, тогаш корисникот ќе треба да „типува“ во
конзолата од постоечки xterm прозорец.
Забелешка
sam –w опцијата за sun4u систем не е поддржана од овој модул
87
send some-char-string — Ехо на низа од карактери отворена со нова линија на конзолата
sendfile filename — Ехо на содржината на filename на конзолата
Забелешка
Горните наредби симулираат влез од конзолата; излезот кој е ехо на xterm
зависи од Solaris/OBP серискиот драјвер.
debug [level] — Се поставува ниво на дебагирање за дебагот да извади level. Ако level
не е овозможено, се добива тековното ниво на дебагирање
level = [0|1|2]
Пример за UI формат
Mod Info
88
За да се добие погорната информација, се внесува help serial-instance-name
во линијата на SAM UI.
Пример: help guest-console
каде
-d е опционален аргумент кој поставува дебагирачко ниво 0, 1 или 2.
89
овозможено, го принта тековното ниво на дебагирање
level = [0|1|2]
Mod Info
modinfo ncu-instance-name овозможува информација за доделување на физички адреси
на Т2 PIU мапирања на PCIE IO/MEM/CONFIG простор.
За да се добијат овие податоци, се пишува help ncu-instance-name во SAM UI.
Пример: help ncu
90
sysconf n2_piu piu bus=pciea ncu=ncu
Mod Info
modinfo instance-name овозможува дополнително мапирање на физички адреси на оваа
инстанца во адресниот простор на T2 I/O.
За да се добие информацијата, се пишува help piu-instance-name во SAM UI линијата
91
10.3.5. IORAM модул
каде
Забелешка:
Моментално е поддржан само sparse моделот. Исто така тој е и преддефиниран.
• -d е опционален аргумент кој поставува ниво на дебагирање 0, 1, или 2.
92
sysconf пример за формат Два примери на формат на IORAM модул се прикажани
подолу
Mod Info
93
На пример, modinfo obp печати следна информација:
Пример:help hv
каде
94
• dd - ден
• HHMMSS – часови, минути, секунди
• yyyy – година, треба да е пред 1970
• -d е опционален аргумент кој поставува ниво на дебагирање 0, 1, или 2.
Забелешка
Симулациското време на Solaris и tod симулациското време се совпаѓаат само
ако фреквенцијата на Solaris STICK е иста со фреквенцијата на SAM STICK.
Mod Info
modinfo tod-instance-name овозможува информација за инстанцата како што е времето
од денот.
За да се добие горната информација, се пишува help tod-instance-name во SAM UI
линијата.
Пример:
help tod
95
PCI-E Bus модулот (pcie_bus) имплементира апстракција на PCIE магистралата.
Тој рутира нагорни/надолни пристапи помеѓу мостот и надолните уреди. Тој одржува
I/O, Mem I Config просторни мапи на надолните уреди. Тој имплементира интерфејс на
SAM PCIE магистралата и рутира пристап со употреба на SAM PCIE интерфејс. Ова е
генеричка имплементација на PCIE мостен уред.
каде
• bridge е име на нагорен мостен уред. Тоа може да биде n2_piu, hammerhead, fire,
итн.
• -d е опционален аргумент и поставува ниво на дебагирање 0, 1, or 2.
Mod Info
modinfo pcie-bus-instance-name овозможува информација за просторни мапирања на
PCIE I/O, Mem, и Config за надолни уреди поврзани на магистралата.
Пример за излез
96
10.3.8. PCIE-PCI Bridge модул
каде
sysconf bridge b0 bus=pciea dev=0 fun=0 secbus=pcia sysconf pci_bus pcia bridge=b0
97
овозможено, се печати тековното ниво.
level = [0|1|2] .
Mod Info
modinfo bridge-instance-name покажува информација специфична за модулот.
За да се добие таа информација, се пишува bridge-instance-name на SAM UI линијата.
пример: help b0
98
10.3.9. PCIE-PCIE Bridge модул
каде
99
Нагорен порт—pcie_a е примарна магистрала на нагорен мост:
sysconf pcie_bridge b0 bus=pcie_a dev=0 fun=0 secbus=pcie_int upstream
100
stop: b0 dump
Mod Info
modinfo bridge-instance-name покажува информации специфични за модулот. За да се
добие погорната информација се пишува help bridge-instance-name во линијата на SAM
UI.
Пример: help b0
каде
101
SAS контролер наречен sas0 е прикачен на PCIE магистрала pcie_a како уред 0,
функција 1. Конфигурацијата за прикачените дискови е во фајлот sasdisk.init. Нивото
на дебагирање е поставено на 2.
UI наредби—Овој модул
UI наредби—прикачени дискови
102
• op [file] — пренасочување на сите o/p во file. Предодредено е да се печати
тековниот op фајл.
• debug [level] — поставува дебагирање на level.
За да се добие информацијата од погоре, се пишува gdisk help во SAM UI. Со
пишување на gdisk ќе се прикажат сите прикачени дискови на системот.
каде
• Во tTdDsS, T е целен ID, D е ID на диск, и S е партициски ID. Само еден диск може
да биде дозволен за секоја цел, така D треба секогаш да биде 0.
• filename е име на фајл со слика на дискот (disk image file).
• vtoc е геометрија на диск во фајлот за слика на дискот.
• ro одредува дека фајлот на сликата може само да се чита.
• rw одредува дека на фајлот на дискот може да се запишува.
Дополнителни информации поврзани со дискот, како што е ID на производител,
ID на производ, и ревизиски ID може да се специфицираат на крајот на секоја линија.
103
LL уредот овозможува фајл системот на домаќинот да биде пристапуван од
симулиран систем кој работи на Solaris.
на пример,
1. Се логираме како root и пуштаме PRTVTOC НА ДИСКОТ КАДЕ ЛЕЖИ root партицијата за
да ја добиеме конфигурацијата на дискот.
За да ја лоцираме оваа партиција, ќе погледнеме во /ETC/VFSTAB И ЌЕ НАЈДЕМЕ ЛОГИЧКИ
ЛИНК КОЈ Е МОНТИРАН НА /. НА ПРИМЕР АКО ROOT ПАРТИЦИЈАТА Е c0t1d0s0, се извршува
PRTVTOC НА ДЕЛОТ 2 ОД ДИСКОТ, ШТО ЗНАЧИ C0T1D0S2. Еве пример:
104
2. Претходната vtoc табела покажува дека партицијатаж root започнува од 0
(прв сектор) и има вкупно 31273544 сектори.Slice 2 од дискот е специјален
дел кој покажува на целиот диск, па така кога извршуваме dd, влезот е дел 2
на дискот кој ја чува партицијата root.
105
Со мапирање на root директориумот на хостот во /ll/root на симулираниот
хост низ LLFS, коризниците може да пристапат до нивниот директориум од
/home/xyz преку /ll/root/home/xyz во SAM.
За доказ, симболички линкови може да се користат за мапирање на следните
директориуми во симулираниот хост до истиот директориум на реалната хост машина:
/home, /net, /vol, /ws, /import, /usr/ccs, /usr/share, /usr/shared, /usr/dist. Притоа, во
симулирана машина, корисниците може да пристапат до нивниот директориум
преку /home/xyz како и преку /ll/ root/ home/xyz.
Потоа кога gdb ќе започне, тој се поврзува со SAM и се извршува gdb наредба:
каде
106
ниво, се на се, надворешниот дебагер е главно ограничен за дебагирање на
мултопроцесорски/мултиканални околини.
Дебагирањето одзема поголем дел од енергијата на програмерот, но е една од
најмалку дискутираните задачи во развојот на софтверот, добивање на системот и
проектите на интеграција. Обично основните чекори за наоѓање грешки остануваат
исти:
• Треба да се направи грешката повторлива.
• Да се изолира проблемот.
• Направат корекции.
• Тестира дали корекцијата го решила проблемот
107
а не програмско дебагирање на кои повеќето софтверски инженери се навикнати.
Дебагерот не работи на симулиран систем, туку работи на хост машина која работи
симулиран систем. Обично, дебагерот ќе земе доста поддршка од компајлерот,
лоадерот и оперативниот систем за да мапира информации за програмот кој се
дебагира.
108
Може да се промени регистерска состојба:
109
Мемориска состојба може да се промени со наредбата:
set 0x10000 0x1 stop: get 0x10000
0x0000000000010000: 0x00000001
Исто така постои наредба за испитување на регистри мапирани на неподвижни
ASI и TLB состојби за секој виртуелен процесор.
Секој модул на уред има специфично множество на наредби со кои се
пристапува до состојбата на тој модул.
110
Кернел модулот unix во претходниот пример не може да се реалоцира -
LOAD_SYMBOLS наредбата може да извади вчитана адреса директно од ELF фајл.
Истото важи и за хипервизорски модул. Имајќи информација за симболи за unix и
хипервизор модулите е доста добро во рана фаза на подигнување на системот.
Модулот gnunix е релоцирачки ELF фајл; почетната адреса за деловите за текст и
податоци (-x и –d опциите, соодветно) мора да се овозможени. Наоѓањето на вчитани
адреси за модулот бара дополнителен труд. Кофа kmdb дебагерот работи на
симулирана машина, тој добива информација за базна адреса од вчитувачот на кернел
KRTLD; оваа информација може да не е достапна за хост машината.
PLATMOD, and SUNW), се одредува BOOT -VV. Овие пет модули секогаш се вчитани од
USFBOOT во ист редослед. MODDEBUG знаменцето контролира информациски лог
генериран од KRTLD за вчитување на други модули откако самиот KRTLD е вчитан.
Примерот 10-3 исклустрира код.
111
Наоѓањето на базни адреси за процесите во корисничко контекст бара работа. Валиден
ID исто така треба да биде достапен. LD_AUDIT И СПЕЦИЈАЛЕН МОДУЛ КОЈ ПРЕСРЕТНУВА
112
За бришење на точката: stop: delete 0
113
10.5.5. Сонди
114
10.6. Симулација со точни циклуси
115
10.6.2. Пристап базиран на извршување
116
10.6.3. Пристап со подмодули
10.6.4. Заклучок
117
10.7.1. RTL косимулација
За време на развојот на RTL, RTL кодот се верификува со пуштање на
косимулациски режим со SAM CPU модел. Основната идеа е пред да заврши
инструкција на RTL, златниот референтен модел ќе изврши некои инструкции и двете
страни ќе ги споредат промените во регистарот на архитектурата добиени од
инструкцијата. Ако нема совпаѓање, работата на косимулацијата е запрена и се
известува за грешка во верификациски лог.
Слика 10-3 прикажува интеракција помешу RTL модул и SAM CPU
златен референтен модел.
118
СЛИКА 10-3 Интеракција помешу RTL модул и SAM CPU златен референтен модел
Без разлика дали TestBench детектира дека инструкцијата завршила, таа испраќа
наредба step со SAM преку конекција со утичницата. TestBench исто така собира
промени од DUT регистарот и ги чува во редица (наречена delta queue) за подоцна да
ги спореди до промени во SAM регистарот. Step наредбата кажува дека каналот треба
да изврши една инструкција.
120
косимулацијата да се совпадне за секој канал и извршување инструкција,
активноста на TLB може да се синхронизаира помеѓу DUT и SAM.
Горниот дел од сликата покажува TLB прекин помеѓу DUT и SAM кога не се
користи TLB-sync. Левата страна покажува DUT активност разделена на 5 операции:
1. На циклус ts1 (time-stamp 1), канал-0 поставува инструкција instr1, користејќи ITLB
влез itlb#1.
2. На циклус ts2, канал-1 заменува ITLB влез itlb#1 со нов влез itlb#1-new.
121
3. На циклус ts3, канал-1 поставува инструкција instr2 користејќи ITLB влез itlb#1-
new.
4. Канал-1 извршува и завршува инструкција instr2.
5. Канал-0 извршува и завршува инструкција instr1.
122
2. Операција за читање на промаршување на L1 кеш носи податоци во L1 кеш.
3. Се извршува операција на запишување.
4. Операцијата за запишување условува невалидност на кеш кога кешто ја менува
содржината поради таквата невалидност.
123
читање.
124
што ако TestBench дава погрешни наредби (или редослед), SAM детектира и известува
за грешка.
125
10.7.2. RTL-SAM косимулација
126