How to get "Clock counts" of opcode programaticaly

12 отговора 0 прегледа
#1

How to get "Clock counts" of opcode programaticaly

Написах нещо за смятане размера на функция в байтове:


#include <iostream>

__declspec(noinline) int Function(int a)
{
return a*a + 1/(a + 5);
}

int main()
{
unsigned char* pStartCodeAddress = reinterpret_cast<unsigned char*>(&Function);
unsigned char* pEndCodeAddress = pStartCodeAddress;

for(;;pEndCodeAddress++)
{
unsigned int opcode = (unsigned int)(*pEndCodeAddress);

if(opcode == 0x000000C3 || opcode == 0x000000CB || opcode == 0x000000C2 || opcode == 0x000000CA) // Hard coded "ret" opcodes
break;

std::cout << std::hex << "0x" << (unsigned int*)pEndCodeAddress << " -> ";
std::cout.width(2);
std::cout.fill('0');
std::cout << opcode << std::endl;
}

std::cout << "Function code size is: " << std::dec << pEndCodeAddress - pStartCodeAddress << " bytes." << std::endl;

return 0;
}


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

Ego praeferro ante vesper bibere aquam slivoevensem
Отговор
в отговор на CObject #2

Re: How to get "Clock counts" of opcode programaticaly

Нищо не си написал бате. В една функция може да има повече от един рет. А процесорното време за дадена инструкция е фиксирано и се смята от честотата на процесора и броя тактове.

Отговор
в отговор на CObject #3

Re: How to get "Clock counts" of opcode programati

абе какво ни занимаваш с глупостите си ? Стига с тия лигавщини - нещо заплатки , соц. екстри ...

Отговор
в отговор на зepoтo #4

Re: How to get "Clock counts" of opcode programaticaly

Знам, знам :)
А и рет кода може да съвпадне с нещо което не е инструкция.
Това може да се оправи. Просто експеримент в този контекст с тази функция.
Ама за заплатите е по-интересно май :)

Ego praeferro ante vesper bibere aquam slivoevensem
Отговор
в отговор на CObject #5

няма да стане така

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




NE SUTOR ULTRA CREPIDAM
Отговор
в отговор на zaphod #6

Re: няма да стане така

Наясно съм с това.
Явно не си чел другия ми пост. :)

Ego praeferro ante vesper bibere aquam slivoevensem
Отговор
в отговор на CObject #7

Re: How to get "Clock counts" of opcode programaticaly

Как ще се оправи бе бате, дори дизасемблиращите програми още не са му хванали цаката.
Иначе верно, колко пари взе за тоя код?

Отговор
в отговор на CObject #8

Re: How to get "Clock counts" of opcode programati

За засичане на времето е доста трудно - имаш само броячи на изпълнени инструкции в MSR-ите и конфигурация да броят само определен тип, или всички. Пък и с всичките тези кешове и паралелни обработки няма как да се извади точен резултат. Можеш да го докараш, но с доста грубо приближение.

Иначе има публикувани таблици от производителите - за всяка инструкция колко примитивни инструкции съдържа във всеки вариант, от колко до колко цикъла на ядрото отнема обработката ..

надолу..
Отговор
в отговор на зepoтo #9

Re: How to get "Clock counts" of opcode programaticaly

"процесорното време за дадена инструкция е фиксирано"

има и такива, за които не е - всички които работят с блокове памет например

Отговор
в отговор на ГHУCEH®ГHOM #10

Re: How to get "Clock counts" of opcode programaticaly

Абе това за фиксираното време какво да му коментираме ...
Ако нямаше неща като cache hit/miss, pipeline flush, page-on-demand - верно си е

Отговор
в отговор на Noble #11

Re: How to get "Clock counts" of opcode programaticaly

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

Отговор
в отговор на зepoтo #12

Re: How to get "Clock counts" of opcode programaticaly

Ми къде да го броим ? Току между 2 инструкции - хоп, време за четене на паметта. Появи се отнякъде като cosmic rays.

Отговор
в отговор на зepoтo #13

Re: How to get "Clock counts" of opcode programaticaly

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

Отговор