My dream CPU

Тестове за производителност

Целта на тестовете е да се установи ефективността на различните системи за оптимизация и ползата от кеш паметите. А именно предсказването на преход при инструкции с преход, компресираните инструкции. Да се установи влиянието на производителността от отношението между честотата на процесора и честотата на паметта. Влиянието на кеш паметта за инструкции и кеш паметта за данни. Ще направя тестове с програмата за сортиране по метода на мехурчето и другата група тестове ще са с програмата която създава двоично дърво, обхожда дървото и поставя данните обратно в масива сортирани.

1. Сортиране

Експеримент 1

Експериментът ще се извърши върху масив от 1000 цели числа генерирани с програма използваща генератор на случайни числа. Самата програма е същата като разгледаната в „V. Тестови програми“, като е леко модифицирана. Някои от инструкциите са подменени с инструкции регистър - регистър, които се изпълняват по-бързо. Листинг 1 показва програмата с нормални инструкции. Листинг 2 е същата програма, но с компресирани инструкции.

Листинг 1. Сортираща програмата

00A: rBs1 <-- #1000
22A: rBs2 <-- #1001
44A: rX1 <-- #0
6lb46A: rMaxX <-- M arraySize
8lb68A: IfMaxX rX1 >= rMaxX ; # lb22
1010I: rA <-- M[rBs1, rX1]0
1212I: rB <-- M[rBs2, rX1]0
1414I: SortAB < ; IfNoExch #lb18
1616I: rA --> M[rBs1, rX1]0
1818I: rB --> M[rBs2, rX1]0
20lb1820A: IncX rX1 #1
2222A: rIP <-- #lb6
24lb2224 A: rX1 <-- #0
2626I: rA <-- M arraySize
2828I: rB <-- #1
3030I: AmnsB --> I: rA
3232I: rA --> M arraySize
3434I: rB <-- #0
3636I: if ( A > B ) jump # lb4
3838ENDPRG


Листинг 2. Сортираща програма с компресирани инструкции


00A: rBs1 <-- # ||| A: rBs2 <-- # 1000 ||| 1001
33A: rX1 <-- #0
5lb45A: rMaxX <-- M arraySize
7lb67A: IfMaxX rX1 >= rMaxX ; # lb22
99I: rA <-- M[rBs1, rX1] ||| I: rB <-- M[rBs2, rX1] 0 ||| 0
1212I: SortAB < ; IfNoExch # lb18
1414I: rA --> M[rBs1, rX1] ||| I: rB --> M[rBs2, rX1] 0 ||| 0
17lb1817A: IncX rX1 # ||| A: rIP <-- # 1 ||| lb6
20lb2220A: rX1 <-- # ||| I: rA <-- M 0 ||| arraySize
2323I: rB <-- # ||| I: AmnsB --> I: rA 1 ||| 0
2626I: rA --> M ||| I: rB <-- # arraySize ||| 0
2929I: if ( A > B ) jump #lb4
3131ENDPRG




Това е таблицата с резултатите от тестовете.
Таблица 1

N – номер на ред
Buss – Buss/CPU clok ratio – отношение между честотата на процесора и паметта. 1:1 равни честоти. 1:8 – шината е 8 пъти по-бавна
Instr Cache – размер на кеша. В редове памет.
Int Cache – размер на кеша за цели числа в редове памет(адреси).


Резултатите са в брой тактови импулси необходими за изпълнението на програмата – Clocks
В 4 колони:

1. Нормални инструкции без включен механизъм за предсказване на преход
2. Нормални инструкции с включен механизъм за предсказване на преход
3. Компресирани инструкции без включен механизъм за предсказване на преход
4. Компресирани инструкции с включен механизъм за предсказване на преход


Ето и графичното представяне на данните от теста.





Анализ на експеримента и изводи.



Влиянието на отношението между честотите на процесора и шината, размера на кеша на инструкциите върху производителността.

С увеличаване на отношението между честотата на процесора и паметта производителността силно намалява. Причината е в многото тактови цикли необходими за достъп до паметта. При отношение 1:1 са необходими 11.5М (милиона) такта за изпълнение на програмата, в таблицата е ред N1, колона 1. Branch N. Същата колона ред N 3, за изпълнението на програмата с 8 пъти по-бавна памет са необходими 64М такта. Шината е 8 пъти по-бавна, производителността пада около 6 пъти. При включване на 16 реда памет резултата се подобрява с около 3%. При включени 32 реда памет резултата се подобрява с около 90%. Това е така защото програмата е малка и е цялата в кеша и производителността се доближава до тази при отношение 1:1 памет/цпу. При памет 256 адресируеми клетки производителността е същата както с 32. Това е така защото останалите клетки не се използват, програмата се събира в 32 адреса.

Влияние на кешът за данни за цели числа Int Cache

Стойностите за Int Cache са в 4-та колона те са 8 реда (адреса) памет в горната половина на таблицата и 256 в долната половина на таблицата.
Тази програма слабо се влияе от размера на кеша за данни. На всеки цикъл тя прочита само 1 операнд от паметта, другият е винаги в кеша, той е там от предишният цикъл. Затова 8 реда памет са и достатъчни и увеличението на тази памет няма голямо влияние.

Влияние на компресираните инструкции върху производителността на CPU

При отношение на честотите процесор/памет влиянието е съвсем малко около .5 %. Вижте ред N1, 1-ва и 3-та колона от резултатите. При памет/cpu 1:8 подобрението е с около 16%. Вижте N3, 1-ва и 3-та колона от резултатите. Тези резултати са без кеш памет за инструкции.

Когато се добави кеш памет за инструкции и цялата програма е в кеша, подобрението е съвсем малко. Разликата е приблизително толкова тактови импулси колкото да влезе програмата в кеша. Вижте ред N9 1-ва и 3-та колона с резултати. Разликата е само 56 тактови импулса.

Да всеки съвременен процесор има кеш за инструкции, но ще има полза и от компресираните инструкции. Компресираните инструкции скъсяват програмата теоретично с 25%, на практика с около 20%. Кешът има малки размери и късите програми са за предпочитане, по-вероятно е да се поберат в него. В реална обстановка (големи програми, многозадачност) ще се налага многократно програма от кеша да се изхвърля и зарежда наново. Малката дължина е предимство.

Влияние на предсказването на прехода върху производителността.

Тук определено имаше изненада. Без кеш за инструкции при отношение на честотите процесор/памет 1:1 има подобрение с по-малко от 0.5%, N1, колона за данни 1 и 2.. При отношение 1:4 има влошаване, съвсем малко с 20 тактови импулса, но влошаване – N2, колона за данни 2. Това е така защото когато 2-ра степен на конвейера има инструкция с преход, започва четене на инструкция от вероятният адрес за преход, защото се предполага, че през това време инструкцията която следва е прочетена. Но тази инструкция не е прочетена, защото отношението на честотите процесор/памет 1:4. Трябват 8 тактови импулса за да се прочете инструкцията и операнда. А инструкцията във втора степен е изпълнена за по-малко от 8 тактови импулса. При тази ситуация нито следващата инструкция е прочетена, нито инструкцията за вероятният преход.

При отношение на честотите процесор/памет 1:8 ред N3 резултатите с или без включен механизъм за предсказване на преход резултата е същият, но поне няма забавяне.

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




Експеримент 2


При този експеримент ще сортираме сортиран масив от 1000 елемента. Първо ще го сортираме в посоката в която е сортиран, тоест няма да има нито една размяна на елементи и нито едно записване в паметта. Това е най леката ситуация. После ще обърнем посоката на сортиране, чрез обръщане на знака в Sort инструкцията. Тук ще имаме размяна при всяко сравнение. Това е най тежката ситуация.

Ето данните от теста:
Таблица 2



N - ред в таблицата
Buss – отношението между честотите на шината и cpu
Instr Cache – кеш за инструкциите
Int Cache – кеш за данни. Целочислен кеш
Резултати от теста в Cloks – брой импулси на тактовия генератор:
1. asc – Нормални инструкции. Сортиране на сортиран масив по посока на сортирането му.
2. desc - Нормални инструкции. Сортиране на сортиран масив по посока обратна на сортирането му.
3. asc - Компресирани инструкции. Сортиране на сортиран масив по посока на сортирането му.
4. desc - Компресирани инструкции. Сортиране на сортиран масив по посока обратна на сортирането му.






Анализ на експеримента и изводи.



Влиянието на отношението между честотите на процесора и шината, размера на кеша на инструкциите върху производителността.

С увеличаване на отношението между честотата на процесора и паметта производителността силно намалява. Особено силно намалява производителността при сортиране на масива в обратна посока. Причината е конфликт с 3-та степен на конвейера за инструкции, която иска да запише разменените стойности на rA и rB обратно в паметта. С увеличаване размера на кеша за инструкции производителността се подобрява и става приблизително равна на производителността при отношение 1:1 памет/cpu, когато цялата програма е в кеша.

Влияние на кешът за данни за цели числа Int Cache

С увеличаването на кеша за данни, производителността се увеличава, но съвсем малко. Така е и при двете посоки на сортиране.



Влияние на компресираните инструкции върху производителността на CPU

Без кеш за инструкции при шина/cpu 1:1 подобрението при сортиране по посока на сортирането е незначителна 0.02%, в обратна посока е 3.7%. При отношение 1:4, 1:8 подобрението и в двете посоки на сортиране е малко над 15%.

При отношение 1:1 и кеш за инструкции 16, няма подобрение при сортиране по посоката на сортиране. При сортиране в обратна посока подобрението е 7.4%, ред 4. Това е така защото при 16 адреса памет вътрешният цикъл е в кеша и се избягват конфликти с 3-та степен на конвейера, която записва обратно в паметта.

При кеш за инструкции 16 и отношения 1:4, 1: 8 при сортиране в същата посока подобрението е съответно 24.9% и 41.9 % . В обратна посока е 33.3 %. Много добро подобрение.

При кеш за инструкции 32, няма подобрение. В тази ситуация цялата програма е в кешът за инструкции и инструкциите се зареждат в 1-ва степен на конвейера за 2 тактови импулса.


Таблицата по-долу е продължение на горната.
Колонка 5 е = 100* (1.asc – 3.asc)/1.asc
Колонка 5 е = 100* (2.desc – 4.desc)/2.desc

Таблица 3




Ето данните и в графичен вид:
5. Данните за сортиране по посока на сортираният масив.
6. Сортиране в обратна посока.



Изводи:

1. При едни и същи стойности за отношение между честотите на шината и cpu, кеш за инструкции и кеш за данни, стойностите от предишният експеримент са винаги между стойностите за сортиране по посока на сортираният масив и стойността за сортиране на масива в обратна посока. Това е логично, следователно експериментът е проведен правилно. Когато сортираме масивът в посоката в която той е сортиран, нямаме нито една размяна на rA и rB, но имаме преход за прескачане на следващите 2 инструкции за запис обратно в паметта. Това е долната граница, под този брой тактови импулси за изпълнението на програмата не може да се слезе. И другата ситуация когато сортираме масивът в обратна посока на която той е сортиран. Тук нямаме преход от инструкцията sort, но винаги имаме запис обратно в паметта. Това е най-тежката ситуация. Това е възможно най-бавното изпълнение.

2. Компресираните инструкции подобряват производителността, особено при малък кеш за инструкции.