Ако процесорът винаги изпълнява инструкции, как да измерим работата му?

Да кажем, че имаме фиктивен едноядрен процесор с програмен брояч и основен набор от инструкции като Load, Store, Compare, Branch, Add, Mul и малко ROM и RAM. При включване изпълнява програма от ROM.

Ще бъде ли честно да се каже, че работата, която процесорът върши, се основава на типа инструкция, която изпълнява. Например, работа на MUL вероятно ще включва задействане на повече транзистори, отколкото например разклонение.

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

Как точно да създадем парадигма за измерване на работата на процесора? Има ли някаква стандартна метрика, може би въз основа на вида на изпълняваните инструкции, консумацията на енергия на процесора, броя на тактовите цикли за завършване или дори дали има достъп до RAM или ROM.

Свързан втори въпрос е какво означава програмата да "спре". Обикновено просто се разклонява в безкраен цикъл или компютърът спира и процесорът чака прекъсване?


person Andy Fusniak    schedule 05.03.2015    source източник


Отговори (3)


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

Освен това има разлика между процесора, който изпълнява "някаква работа" и "полезна работа". Процесорът сам по себе си не може да каже, но операционната система обикновено може. С изключение на някои вградени софтуери, CPU никога няма да изпълнява една задача, а по-скоро операционна система с различни процеси в нея. Ако няма полезен процес за изпълнение, операционната система ще планира „неактивната задача“, което най-вече означава поставяне на процесора в спящ режим за известно време (вижте по-горе) или просто записване на цикли на процесора в цикъл, който не прави нищо полезно. Изчисляването на съотношението на времето, прекарано в неактивна задача, към времето, прекарано в редовни задачи, дава бизнес фактора на процесора.

Така че докато в старите времена на DOS, когато компютърът изпълняваше (почти) само една задача, беше вярно, че той винаги правеше нещо. Много приложения използваха така нареченото чакане на заетост, ако просто трябваше да забавят изпълнението си за известно време, без да правят нищо полезно. Но днес почти винаги ще има интелигентна операционна система, която може да стартира процеса на неактивност, отколкото да приспи процесора, да намали скоростта му и т.н.

person Michał Kosmulski    schedule 05.03.2015
comment
Процесорът може също да спре в очакване на памет (или дори при инструкция с висока латентност). Безполезна работа е възможна и с (неправилно) предвиждане на разклоняване (предсказанието, че дадена инструкция няма да генерира изключение, е еквивалентно на предсказване на разклоняване). - person Paul A. Clayton; 05.03.2015

О, момче, това е трудно. Това е много практичен въпрос, тъй като е мярка за производителност и ефективност, а също и много субективен въпрос, тъй като преценява кои инструкции са повече или по-малко „полезни“ за постигане на целта на дадено приложение. Целта на едно приложение може да бъде почти всичко, като намиране на решение на сложно матрично уравнение или изобразяване на изображение на дисплей.

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

По същия начин съвременните процесори могат да изпълняват множество инструкции едновременно, да ги изпълняват неправилно и да предвиждат и изпълняват кои инструкции ще бъдат изпълнени следващите, преди вашата програма (т.е. IP или указател на инструкции) действително да ги достигне. Не искате да включвате инструкции, чието изпълнение никога всъщност не завършва, например защото процесорът предполага грешно и трябва да изчисти тези инструкции, напр. тъй като поради грешно предсказване на клон. Така че по-добър показател е отчитането на тези инструкции, които действително са завършени. Изпълнените инструкции се наричат ​​„пенсионирани“.

Така че трябва да броим само онези инструкции, които са завършени (т.е. пенсионирани), и цикли, които действително се използват за изпълнение на инструкции (т.е. без прекъсване).)

Може би най-практичният общ показател за „работа“ е CPI или цикли на инструкция: CPI = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY. CPU_CLK_UNHALTED.CORE са цикли, използвани за изпълнение на действителни инструкции (срещу тези, които са „пропилени“ в неактивно състояние). INST_RETIRED са тези инструкции, които завършват (срещу тези, които не се дължат на нещо като грешно предвиждане на клон).

Опитът да се получи по-специфична метрика, като например инструкциите, които допринасят за решението на матрица, множествено, и изключването на инструкции, които не допринасят пряко за изчисляване на решението, като например контролни инструкции, е много субективно и трудно за събиране на статистика . (Има някои, които можете, като например VECTOR_INTENSITY = VPU_ELEMENTS_ACTIVE / VPU_INSTRUCTIONS_EXECUTED, което е броят SIMD векторни операции, като SSE или AVX, които се изпълняват за секунда. Тези инструкции е по-вероятно да допринесат директно за решаването на математически решение, тъй като това е тяхната основна цел.)

Сега, след като ви разубедих, вижте някои от ресурсите за оптимизация във вашия местен приятелски ресурс за разработчици на Intel, software.intel.com. По-специално, проверете как ефективно да използвате VTune. Не предполагам, че трябва да получите VTune, въпреки че можете да получите безплатен или много намален студентски лиценз (мисля). Но материалът ще ви разкаже много за увеличаване на производителността на вашите програми (т.е. оптимизиране), което, ако се замислите, е увеличаване на полезната работа, която вашата програма извършва.

person Taylor Kidd    schedule 06.03.2015

Разширявайки малко отговора на Михал:

Програмата, написана за модерни многозадачни операционни системи, е по-скоро като колекция от манипулатори на събития: те ефективно настройват слушатели за I/O и след това връщат контрола обратно на операционната система. ОС ги събужда всеки път, когато има нещо за обработка (напр. действие на потребителя, данни от устройството) и те „заспиват“, като се обаждат на ОС, след като приключат с обработката. Повечето операционни системи също ще изпреварват в случай, че един процес претоварва процесора твърде дълго и гладува останалите.

След това ОС може да следи колко време действително се изпълнява всеки процес (като помни началния и крайния час на всяко изпълнение) и да генерира статистически данни като процесорно време и натоварване (дължина на опашката на готовия процес).

И да отговоря на втория ви въпрос:

Спирането най-вече означава, че даден процес вече не е планиран и всички свързани ресурси (структури от данни за планиране, манипулатори на файлове, пространство в паметта, ...) са унищожени. Това обикновено изисква процесът да извика специално извикване на ОС (syscall/прекъсване), така че ОС да може да освободи ресурсите елегантно.

Ако обаче даден процес попадне в безкраен цикъл и спре да отговаря на събития от ОС, тогава той може да бъде спрян само принудително (като просто не се изпълнява повече).

person billc.cn    schedule 05.03.2015