RE: Cycle counter
From: Zajerko-McKee, Nick <hidden>
Date: 2002-09-13 16:41:28
Is this under a OS or a single execution? Are there interrupts enabled? If
so, disable them for measurements. (Clock interrupt, serial port, etc.).
BTW, most MIPS implementations for OS's and monitors use the count/compare
for their main tick. If you set it to zero you may be stepping on someone's
tick. A better method might be to read the count register and read it again
at the end and do a difference - that way you preserve other's values.
Other reasons for a delay: to fetch code (external mem ->cache -> cpu) and
push items onto/off the stack... Theres probably more that I can't think of
right now...
-----Original Message-----
From: Gareth [mailto:g.c.bransby-99@student.lboro.ac.uk]
Sent: Friday, September 13, 2002 12:28 PM
To: linux-mips@linux-mips.org
Subject: Cycle counter
Hi,
Another question reagarding the mips malta board. I am wanting to be able to
find out how many cycles a certain loop takes to execute. I understand there
is
a cycle counter built into the processor that I want to use for this. I have
a
bit of inline assembly to do the job but the results I am getting are not
consistent so i think there is probably something wrong with my attempt at
the
inline assembly. Here is the code :
void al_signal_start(void);
size_t al_signal_finished(void);
unsigned int GetcpuCycles(void);
char str[8];
int main (void)
{
double x;
al_signal_start();
x = al_signal_finished();
printf("GetcpuCycles says : %f \n",x);
return 0;
}
size_t al_signal_finished(void)
{
return GetcpuCycles();
}
void al_signal_start(void)
{
int zero,temp;
__asm__("move $2, $zero");
__asm__("nop");
__asm__("mtc0 $2, $9" : : "r" (temp));
__asm__("nop");
__asm__("nop");
__asm__("nop");
}
unsigned int GetcpuCycles(void)
{
int temp;
__asm__(".set reorder");
__asm__("mfc0 $2, $9" : : "r" (temp));
__asm__("nop");
__asm__("nop");
__asm__("nop");
/*__asm__("jr $31" );*/
}
As you can see, main just starts and stops the counter with no instructions
in
between. I expexcted the cycle count to be zero or close to it because of
the
instructions required to get the count but this is not the case. I am
getting
numbers like 8499. Is there just something wrong with my assembly or is
there
something else I am missing?
Thanks for any help
Gareth