#include <u.h>
#include <libc.h>
#include <thread.h>
extern int xadd(int*, int);
enum {
Ndflt = 1<<21,
Rdflt = 1,
Odflt = 10,
};
int N = Ndflt;
int R = Rdflt;
int O = Odflt;
Channel *endc;
uchar pad[64];
int valtas;
uchar pad[64];
int val;
uchar pad[64];
long aincval;
uchar pad[64];
int xaddval;
void
tasthread(void*)
{
uint i;
for(i = 0; i < N; i++){
_tas(&valtas);
val++;
valtas = 0;
}
sendul(endc, 1);
threadexits("");
}
void
aincthread(void*)
{
uint i;
for(i = 0; i < N; i++){
ainc(&aincval);
}
sendul(endc, 1);
threadexits("");
}
void
xaddthread(void*)
{
uint i;
for(i = 0; i < N; i++){
xadd(&xaddval, 1);
}
sendul(endc, 1);
threadexits("");
}
void
usage(void)
{
fprint(2, "usage: tastest [-R tasproc]\n");
exits("usage");
}
void
threadmain(int argc, char **argv)
{
int i;
uvlong t;
ARGBEGIN{
default:
usage();
case 'R':
R = atoi(EARGF(usage()));
break;
}ARGEND
if(argc > 0)
usage();
endc = chancreate(sizeof(ulong), 0);
t = -nsec();
for(i = 0; i < R; i++)
proccreate(tasthread, nil, 4*1024);
for(i = 0; i < R; i++)
recvul(endc);
t += nsec();
print("%lld tas\n", t);
t = -nsec();
for(i = 0; i < R; i++)
proccreate(aincthread, nil, 4*1024);
for(i = 0; i < R; i++)
recvul(endc);
t += nsec();
print("%lld ainc\n", t);
t = -nsec();
for(i = 0; i < R; i++)
proccreate(xaddthread, nil, 4*1024);
for(i = 0; i < R; i++)
recvul(endc);
t += nsec();
print("%lld xadd\n", t);
threadexits("");
}
|