О, момче, това е трудно. Това е много практичен въпрос, тъй като е мярка за производителност и ефективност, а също и много субективен въпрос, тъй като преценява кои инструкции са повече или по-малко „полезни“ за постигане на целта на дадено приложение. Целта на едно приложение може да бъде почти всичко, като намиране на решение на сложно матрично уравнение или изобразяване на изображение на дисплей.
В допълнение, съвременните процесори правят неща като стробиране на часовника в състояния на неактивност на захранването. Осцилаторът все още произвежда цикли, но не се изпълняват инструкции, тъй като определени вериги са неактивни, тъй като циклите не ги достигат. Това са цикли, които не правят нищо полезно и трябва да бъдат игнорирани.
По същия начин съвременните процесори могат да изпълняват множество инструкции едновременно, да ги изпълняват неправилно и да предвиждат и изпълняват кои инструкции ще бъдат изпълнени следващите, преди вашата програма (т.е. 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