lkml.org 
[lkml]   [2007]   [Dec]   [11]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
DateWed, 12 Dec 2007 00:31:18 +0100
Subject[RFT] Port 0x80 I/O speed
FromRene Herman <>
Good day.

Would some people on x86 (both 32 and 64) be kind enough to compile and run 
the attached program? This is about testing how long I/O port access to port 
0x80 takes. It measures in CPU cycles so CPU speed is crucial in reporting.

Posted a previous incarnation of this before, buried in the outb 0x80 thread 
which had a serialising problem. This one should as far as I can see measure 
the right thing though. Please yell if you disagree...

For me, on a Duron 1300 (AMD756 chipset) I have a constant:

rene@7ixe4:~/src/port80$ su -c ./port80
cycles: out 2400, in 2400

and on a PII 400 (Intel 440BX chipset) a constant:

rene@6bap:~/src/port80$ su -c ./port80
cycles: out 553, in 251

Results are (mostly) independent of compiler optimisation, but testing with 
an -O2 compile should be most useful. Thanks!

Rene.
/* gcc -W -Wall -O2 -o port80 port80.c */
#include <stdlib.h>
#include <stdio.h>

#include <sys/io.h>

#define LOOPS 10000
inline unsigned long long rdtsc(void)
{
	unsigned long long tsc;
	asm volatile ("rdtsc": "=A" (tsc));

	return tsc;
}
inline void serialize(void)
{
	asm volatile ("cpuid": : : "eax", "ebx", "ecx", "edx");
}
int main(void)
{
	unsigned long long start;
	unsigned long long overhead; 
	unsigned long long output;
	unsigned long long input;
	int i;
	if (iopl(3) < 0) {
		perror("iopl");
		return EXIT_FAILURE;
	}
	asm volatile ("cli");
	start = rdtsc();
	for (i = 0; i < LOOPS; i++) {
	 	serialize();	
		serialize();
	}
	overhead = rdtsc() - start;
	start = rdtsc() + overhead;
	for (i = 0; i < LOOPS; i++) {
		serialize();
		asm volatile ("outb %al, $0x80");
		serialize();
	}
	output = rdtsc() - start;
	start = rdtsc() + overhead;
	for (i = 0; i < LOOPS; i++) {
		serialize();
		asm volatile ("inb $0x80, %%al": : : "al");
		serialize();
	}
	input = rdtsc() - start;
	asm volatile ("sti");
	output /= LOOPS;
	input  /= LOOPS;
	printf("cycles: out %llu, in %llu\n", output, input);

	return EXIT_SUCCESS;
}
\
 
 \ /
  Last update: 2007-12-12 00:35    [from the cache]
©2003-2008