Re: Memory mapped IO vs Port IO

Andi Kleen
2003-09-12T18:10:41Z

On Fri, 12 Sep 2003 11:04:29 -0700
jbarnes@sgi.com (Jesse Barnes) wrote:

> On Fri, Sep 12, 2003 at 08:00:03PM +0200, Andi Kleen wrote:
> > jbarnes@sgi.com (Jesse Barnes) writes:
> >
> > > Ok, Andi asked for benchmarks, so I ran some. Let this should be a
> > > lesson on why you shouldn't use port I/O :) I ran these on an SGI Altix
> > > w/900 MHz McKinley processors.
> > >
> > > Just straight calls to the routines (all of these are based on the
> > > average of 100 iterations):
> > > writeq(val, reg) time: 64 cycles
> > > outl(val, reg) time: 2126 cycles
> > ^^^^^
> > >
> > > A simple branch:
> > > if (use_mmio)
> > > writeq(val, reg) time: 132 cycles
> > > else
> > > outl(val, reg) time: 1990 cycles
> > ^^^^^
> > Something seems to be wrong in your numbers.
> >
> > Surely the outl in the if () cannot be faster than the pure outl() ?
>
> Well, they're approximate at best... For outl the branch doesn't seem
> to matter since it takes forever regardless.

True. Ok for PIO it doesn't matter. I'm surprised the hit is that big
for MMIO. What code does the IA64 compiler generate for this?
If it was a branch it should have been predicted.

I guess we could use dynamic patching like the alternative() code on
i386 does for prefetches etc., but that may be a bit of overkill...
Or fix the makefiles that they can easily compile two versions of
the driver.

-Andi