dillon@CORY.BERKELEY.EDU (Matt Dillon) (03/26/88)
Here are some timing tests on the relative speed of message
passing and software interrupt overhead. The code is included.
(It's too small to bother the moderators).
-Matt
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# README
# softint.c
# softint.uue
# taskswitch.c
# taskswitch.uue
# This archive created: Sat Mar 26 00:56:19 1988
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'README'" '(1455 characters)'
if test -f 'README'
then
echo shar: "will not over-write existing file 'README'"
else
cat << \!Funky!Stuff! > 'README'
This is too small to post to the moderators. It should interest
those of you who are interested in practical message passing speeds
between two processes and practical software interrupt handler speeds.
TEST 1:
Given two tasks running at priority 0 (the priority doesn't
really effect the results) with no other applications running,
how fast can these two tasks bandy a message back and forth?
Each cycle is defined by: A-(msg)->B, B-(msg)->A
results: 1000 cycles / second
TEST 2:
Given a task running at priority 1 (again, the priority could
just as well be 0), with no other applications running,
how fast can this task bandy a message to a software interrupt
handler (e.g. the port type is SOFTINT and the handler replies
the message):
Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A
results: 1736 cycles / second
TEST Conditions:
The test programs are written in C. They use standard calls for
everything. NOTE: The software interrupt handler is also written
in C, and thus has a bit more overhead than one would normally
associate with a software interrupt. However, the task-switch
tester has no more overhead than equivalent assembly.
All code is placed in public domain.
The numbers indicated are on a standard A1000 with expansion
memory (which doesn't really matter all that much), with no
other applications running during the test.
The code was compiled under Aztec C.
-Matt
!Funky!Stuff!
fi # end of overwriting check
echo shar: "extracting 'softint.c'" '(2220 characters)'
if test -f 'softint.c'
then
echo shar: "will not over-write existing file 'softint.c'"
else
cat << \!Funky!Stuff! > 'softint.c'
/*
* softint [#iterations]
*
* Matthew Dillon
*
* 1000 switches/sec. (taskswitch)
* 1736 softints/sec. (softint)
*/
typedef struct MsgPort PORT;
typedef struct Task TASK;
typedef struct Message MSG;
typedef struct Interrupt INTR;
extern TASK *CreateTask();
extern TASK *FindTask();
extern PORT *CreatePort();
extern PORT *CreateSoftPort();
extern MSG *GetMsg();
extern void *AllocMem();
extern void subtask();
extern void softhandler();
int Enable_Abort;
int Iterations;
PORT *Port;
TASK *Task;
MSG Msg;
main(ac,av)
char *av[];
{
TASK *task;
MSG *msg;
if (ac == 1) {
puts("softint #iterations");
exit(1);
}
Iterations = atoi(av[1]);
Task = FindTask(NULL);
Enable_Abort = 0;
Port = CreateSoftPort(softhandler);
puts("go");
if (task = CreateTask("switchrate.slave", 1, subtask, 2048))
Wait(SIGBREAKF_CTRL_D);
puts("stop");
DeleteSoftPort(Port);
puts("done");
}
PORT *
CreateSoftPort(handler)
void (*handler)();
{
register PORT *port = AllocMem(sizeof(PORT), MEMF_PUBLIC|MEMF_CLEAR);
register INTR *intr = AllocMem(sizeof(INTR), MEMF_PUBLIC|MEMF_CLEAR);
intr->is_Node.ln_Pri = 0;
intr->is_Node.ln_Type = NT_INTERRUPT;
intr->is_Data = NULL;
intr->is_Code = handler;
port->mp_Flags = PA_SOFTINT;
port->mp_SigTask = (TASK *)intr;
port->mp_Node.ln_Type = NT_MSGPORT;
NewList(&port->mp_MsgList);
return(port);
}
DeleteSoftPort(port)
PORT *port;
{
FreeMem(port->mp_SigTask, sizeof(INTR));
FreeMem(port, sizeof(PORT));
}
/*
* Software interrupt handler. Called with
* D0/D1/A0/A1/A5/A6 scratch as far as we are concerned.
*/
void
softhandler()
{
MSG *msg;
#asm
movem.l D2/D3,-(sp)
#endasm
geta4();
if (msg = GetMsg(Port)) {
if (!--Iterations)
msg->mn_Length = 1;
ReplyMsg(msg);
}
#asm
movem.l (sp)+,D2/D3
#endasm
}
void
subtask()
{
geta4();
Msg.mn_ReplyPort = CreatePort(NULL,0);
Msg.mn_Length = 0;
while (Msg.mn_Length == 0) {
PutMsg(Port, &Msg);
WaitPort(Msg.mn_ReplyPort);
GetMsg(Msg.mn_ReplyPort);
}
DeletePort(Msg.mn_ReplyPort);
Forbid();
Signal(Task, SIGBREAKF_CTRL_D);
RemTask(NULL);
/* No Permit */
}
!Funky!Stuff!
fi # end of overwriting check
echo shar: "extracting 'softint.uue'" '(6886 characters)'
if test -f 'softint.uue'
then
echo shar: "will not over-write existing file 'softint.uue'"
else
cat << \!Funky!Stuff! > 'softint.uue'
begin 644 softint
M```#\P`````````#``````````(```10````D@````$```/I```$4$[Z`G1.
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
M'%A/+RR",DZZ!SA83T*L@C)@@&EC;VXN;&EB<F%R>0!724Y$3U<`*@`@;P`$
M(`A*&&;\D<`@"%.`3G5.50``2&R`&"\M``A.N@`(4$].74YU3E4``"\$*"T`
M""\M``PO!$ZZ`#103[B\````"F8F(&T`#!`H``Q(@$C`"```!V<42'C__R\M
M``Q.N@#^4$\H'TY=3G5@^$Y5```O"B1M``P@4K'J``1E&B`M``C`O````/\O
M`"\*3KH`T%!/)%].74YU(%)2DA`M``L0@$B`2,#`O````/]@Y$Y5```O"D'L
M@`(D2"!*U?P````6+PAA$%A/0>R!NK7(9>HD7TY=3G5.50``2.<(("1M``AX
M`"`*9@IP_TS?!!!.74YU2BH`#&=4""H``@`,9PQ(>/__+PIA5E!/*``0*@`-
M2(!(P"\`3KH%"%A/B(`(*@`!``QG"B\J``A.N@(\6$\(*@`%``QG%"\J`!).
MN@+86$\O*@`23KH"(%A/0I)"J@`$0JH`"$(J``P@!&",3E7__DCG""`D;0`(
M0?K_0BE(@@H(*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,B@2F*H`""\$+RH`
M"!`J``U(@$C`+P!.N@*63^\`#+"$9Q`(Z@`$``Q"DD*J``1P_V"^#*W_____
M``QF$`BJ``(`#$*20JH`!'``8*1*J@`(9@@O"DZZ`*183PQJ``$`$&8P&VT`
M#___2'@``4AM__\0*@`-2(!(P"\`3KH",D_O``RPO`````%FF"`M``Q@`/]@
M)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2DA`M``\0@$B`2,#`O````/]@
M`/\P3E4``"\*0>R``B1(2BH`#&<8U?P````60>R!NK7(90AP`"1?3EU.=6#B
M0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$`$ZZ`,)83RM`__QF\``$`
M$"`*T+P````.)4``""1?3EU.=35\!```$`CJ``$`#"5M__P`"!`J``U(@$C`
M+P!.N@#>6$]*@&<&`"H`@``,8,Q.50``2.<`,"1L@=Y@%"92("H`!%"`+P`O
M"DZZ!B)03R1+(`IFZ$*L@=Y,WPP`3EU.=4Y5```O"D'Z_\8I2((.0J<@+0`(
M4(`O`$ZZ!.)03R1`2H!F"'``)%].74YU)*R!WB5M``@`!"E*@=X@"E"`8.9.
M50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1L@=Y@#B!M``A1B+'*9Q(F2B12
M(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2@=X@*@`$4(`O`"\*3KH%>%!/<`!@
MV$Y5```O"G(&("T`"$ZZ`K0D0-7L@>Y*K0`(;1(P+(&Z2,`B+0`(LH!L!$J2
M9A`I?`````*"$G#_)%].74YU<@8@+0`(3KH"?"!L@>XO,`@`3KH"R%A/2H!G
M!'`!8`)P`?E4``"\M``A.N@*26$]*@&8.3KH"G"E`@A)P_TY=3G5P`&#X
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
ML@```^P````!`````0```NH````````#\@```^H```!W````````````````
M`0`````!``````````````````````$!`````0`````````````````````!
M`@````$`````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````%`````````````````````(``0`!
>````7``!``````````````/R```#ZP````$```/R
`
end
!Funky!Stuff!
fi # end of overwriting check
echo shar: "extracting 'taskswitch.c'" '(1265 characters)'
if test -f 'taskswitch.c'
then
echo shar: "will not over-write existing file 'taskswitch.c'"
else
cat << \!Funky!Stuff! > 'taskswitch.c'
/*
* taskswitch [#iterations]
*
* Matthew Dillon
*
* 1000 switches/sec. (taskswitch) rough figures
* 1736 softints/sec. (softint)
*/
typedef struct MsgPort PORT;
typedef struct Task TASK;
typedef struct Message MSG;
extern TASK *CreateTask();
extern PORT *CreatePort();
extern MSG *GetMsg();
extern void subtask();
int Enable_Abort;
PORT *Port;
MSG Msg;
main(ac,av)
char *av[];
{
int i, n;
TASK *task;
MSG *msg;
if (ac == 1) {
puts("taskswitch #iterations");
exit(1);
}
n = atoi(av[1]);
Enable_Abort = 0;
if (Port = CreatePort(NULL,0)) {
if (task = CreateTask("taskswitch.slave", 0, subtask, 2048)) {
puts("go");
for (i = 0; i < n; ++i) {
WaitPort(Port);
ReplyMsg(GetMsg(Port));
}
puts("stop");
WaitPort(Port);
msg = GetMsg(Port);
msg->mn_Length = 1;
ReplyMsg(msg);
WaitPort(Port);
}
DeletePort(Port);
}
puts("done");
}
void
subtask()
{
geta4();
Msg.mn_ReplyPort = CreatePort(NULL,0);
Msg.mn_Length = 0;
while (Msg.mn_Length == 0) {
PutMsg(Port, &Msg);
WaitPort(Msg.mn_ReplyPort);
GetMsg(Msg.mn_ReplyPort);
}
DeletePort(Msg.mn_ReplyPort);
Forbid();
PutMsg(Port, &Msg);
RemTask(NULL);
/* No Permit */
}
!Funky!Stuff!
fi # end of overwriting check
echo shar: "extracting 'taskswitch.uue'" '(6691 characters)'
if test -f 'taskswitch.uue'
then
echo shar: "will not over-write existing file 'taskswitch.uue'"
else
cat << \!Funky!Stuff! > 'taskswitch.uue'
begin 644 taskswitch
M```#\P`````````#``````````(```0L````D`````$```/I```$+$[Z`@!.
M5?_P#*T````!``AF%$AZ`.A.N@6X6$](>``!3KH+O%A/(&T`#"\H``1.N@%N
M6$\K0/_X0JR"(D*G0J=.N@VH4$\I0((F9P``HDAX"`!(>@#>0J=(>@"Y3KH.
MB$_O`!`K0/_T9WI(>@"X3KH%8%A/0JW__&`@+RR")DZZ#_I83R\L@B9.N@]Z
M6$\O`$ZZ#\I83U*M__P@+?_\L*W_^&W62'H`@4ZZ!2983R\L@B9.N@_&6$\O
M+((F3KH/1EA/*T#_\"!M__`Q?``!`!(O+?_P3KH/AEA/+RR")DZZ#YI83R\L
M@B9.N@V,6$](>@`\3KH$W%A/3EU.=71A<VMS=VET8V@@(VET97)A=&EO;G,`
M=&%S:W-W:71C:"YS;&%V90!G;P!S=&]P`&1O;F4``$Y5``!.N@$\0J="ITZZ
M#*I03RE`@CQ";()`2FR"0&8D2&R"+B\L@B9.N@[:4$\O+((\3KH/%%A/+RR"
M/$ZZ#I183V#6+RR"/$ZZ#/I83TZZ#E9(;((N+RR")DZZ#JA03T*G3KH.NEA/
M3EU.=4Y5``!(YPP@)&T`"'@`>@`,$@`@9@12BF#V#!(`+68$4HIZ`0P2`#!M
M)@P2`#EN("!*4HH0$$B`2,`B!..!T($D!.>"T((H`)B\````,*H5G!B`$
M1(!@`B`$3-\$,$Y=3G5A<$/L@=Y%[('>M<EF#C(\`!AK"'0`(L)1R?_\*4^!
MXBQX``0I3H'F2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH
M*4"!ZF8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.
M=4Y5```O"DAY``$``#`L@;K!_``&+P!.N@Q$4$\I0('N9A1"ITAY``$``$ZZ
M"QI03RYL@>).=2!L@>Y":``$(&R"\13KH*$EA/
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
M`````0```G8````````#\@```^H```!W`````````````````0`````!````
M``````````````````$!`````0`````````````````````!`@````$`````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````%`````````````````````(``0`!````7``!````
5``````````/R```#ZP````$```/R
`
end
!Funky!Stuff!
fi # end of overwriting check
exit 0
# End of shell archivehaitex@pnet01.cts.com (Wade Bickel) (03/29/88)
dillon@CORY.BERKELEY.EDU (Matt Dillon) writes: > > Here are some timing tests on the relative speed of message >passing and software interrupt overhead. The code is included. >(It's too small to bother the moderators). > > -Matt > > >TEST 1: > Given two tasks running at priority 0 (the priority doesn't > really effect the results) with no other applications running, > how fast can these two tasks bandy a message back and forth? > > Each cycle is defined by: A-(msg)->B, B-(msg)->A > > results: 1000 cycles / second > >TEST 2: > Given a task running at priority 1 (again, the priority could > just as well be 0), with no other applications running, > how fast can this task bandy a message to a software interrupt > handler (e.g. the port type is SOFTINT and the handler replies > the message): > > Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A > > results: 1736 cycles / second > >TEST Conditions: > > The test programs are written in C. They use standard calls for > everything. NOTE: The software interrupt handler is also written > in C, and thus has a bit more overhead than one would normally > associate with a software interrupt. However, the task-switch > tester has no more overhead than equivalent assembly. In my interrupt server I have been useing shared memory with a few conventions applied to prevent conflicts. Seems to me that 1700 cycles is at least two orders of magnitude smaller than the possble communications rate I can achieve. Are you sure this is correct? Thanks, Wade. UUCP: {cbosgd, hplabs!hp-sdd, sdcsvax, nosc}!crash!pnet01!haitex ARPA: crash!pnet01!haitex@nosc.mil INET: haitex@pnet01.CTS.COM
dillon@CORY.BERKELEY.EDU (Matt Dillon) (03/30/88)
:>TEST 1: :> Each cycle is defined by: A-(msg)->B, B-(msg)->A :> results: 1000 cycles / second :>TEST 2: :> Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A :> results: 1736 cycles / second : In my interrupt server I have been useing shared memory with a few :conventions applied to prevent conflicts. Seems to me that 1700 cycles is :at least two orders of magnitude smaller than the possble communications rate :I can achieve. Are you sure this is correct? I think you didn't read my test descriptions. The only type of interrupt I tested was a SOFTWARE interrupt generated continuously from a task. I did NOT test HARDWARE interrupts. Anybody who has traced the code can tell you that CA did a slam-bang job on the hardware interrupts.... very little overhead for a lot of nice features. Assuming an interrupt handler doesn't have to PutMsg() or Signal() anybody, it goes extremely fast.... essentially the standard 68000 interrupt overhead plus a small number of instructions. Throughput of at least 8000+ interrupts / sec (average), assuming your interrupt handler doesn't need to do much. (that is a rough figure, it is probably even faster!) If your hardware interrupt *does* PutMsg() or Signal() something, we are still talking 2500+ interrupts / sec (average). -Matt