This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
additional vector function to improve register fetch performance
- To: gdb at sourceware dot cygnus dot com
- Subject: additional vector function to improve register fetch performance
- From: jtc at redback dot com (J.T. Conklin)
- Date: 07 Dec 2000 14:16:59 -0800
- Reply-To: jtc at redback dot com
While we're talking about register fetch and stores, I had an idea the
outher night about improving performance by adding some new functions
to the target vector.
* target_prefetch_register()
With the register cache and targets that always fetch the entire
register set, fetch performance is as good as can be expected. But
with a target that can fetch one register at a time, GDB will issue
multiple single register fetches. Due to command/response latency,
this has a significant performance impact.
One way this could be addressed is to always fetch the entire
register set. The remote protocol is like this, while it can set a
single register, there is no command to fetch one. This approach
may lose when the register set is large and the number of registers
to be fetched is small; it may be possible to issue several single-
register fetches in the time for one for the entire register set.
Another is the proposed target_prefetch_register() vector function.
All this does is do a hint that we'll need the value of a register
sometime "soon". A sequence like:
sp = read_sp ();
fp = read_fp ();
pc = read_pc ();
r0 = read_register (R0_REGNUM);
Might be changed to:
prefetch_sp ();
prefetch_fp ();
prefetch_pc ();
prefetch_register (R0_REGNUM);
sp = read_sp ();
fp = read_fp ();
pc = read_pc ();
r0 = read_register (R0_REGNUM);
(I'm assuming the prefetch* functions are added to regcache.c to do
whatever housekeeping is required and call the target vector
function).
In a trival target, prefetch would do nothing. In one that has a
async protocol, it might start fetching those registers (a callback
would install the value in the cache when the values were received).
In one that could do single, or full register set fetches, it might
defer fetching anything until the first "real" read was received.
At that time it would decide whether what type of fetch is the most
optimum to perform.
The disadvantage of this is that there is no benefit if the prefetch
hints aren't added. The good thing is that it keeps the interface
between the target independent and target specific parts of GDB
reasonably clean. For contrast, imagine of a target vector function
that took a list of registers to read. This (IMO) would be much
more difficult to use effectively.
Thoughts? I have some partially thought ideas on how to do the same
for register stores, but I'm going to wait until they've firmed up a
bit before sharing.
--jtc
--
J.T. Conklin
RedBack Networks