Чтение онлайн

ЖАНРЫ

QNX/UNIX: Анатомия параллелизма
Шрифт:

// при инициализации мы сразу получаем скорость процессора клиента

result data;

cout << "CPU speed [с.p.s ]: client = " << data.cps;

// пытаемся подключиться к серверу-менеджеру

int fd = open(PATH, O_RDONLY);

if (fd < 0) exit("server not found");

// читаем его параметры

if (read(fd, &data, sizeof(result)) == -1)

exit("parameter block read");

cout << ", server = " << data.cps << endl;

tim = new uint64_t[num];

uint64_t tim2;

uint8_t *bufin = new uint8_t[blk];

*bufou = new uint8_t[blk];

//
определяем дескриптор сетевого узла

int32_t node = netmgr_strtond(PATH, NULL);

// это интересное место: если в имени нет сетевого префикса пути,

// но это имя удается открыть, то это локальный хост!

if (node == -1 && fd > 0 && errno == ENOENT)

node = ND_LOCAL_NODE;

// по адресным данным, полученным ранее по read, создаем канал

// для прямого обмена сообщениями с тем же процессом:

int coid = ConnectAttach(node, data.pid, data.chid, _NTO_SIDE_CHANNEL, 0);

if (coid < 0) exit("connect to message channel");

cout << " - message exchange:" << flush;

// обмен по каналу низкоуровневых сообщений

for (int i = 0; i < num; i++) {

tim[i] = ClockCycles;

if (MsgSend(coid, bufou, blk, bufin, blk) == -1)

exit("exchange data with channel");

tim[i] = ClockCycles - tim[i];

}

outtim;

ConnectDetach(coid);

// повторяем в точности тот же обмен, но по запросу devctl

unsigned int DCTL = (blk<<16) + DCMD_SRR;

cout << "- manager exchange:" << flush;

for (int i = 0; i < num; i++) {

tim[i] = ClockCycles;

if (devctl(fd, DCTL, bufou, blk, NULL) ! = EOK)

exit("DEVCTL error");

tim[i] = ClockCycles - tim[i];

}

outtim;

close(fd);

delete [] bufin;

delete [] bufou;

delete [] tim;

return EXIT_SUCCESS;

}

Смотрим

локальные результаты исполнения и оценки, которые дает нам эта клиентская программа (знаком отмечено С.К.О. предшествующего ему в выводе значения измеренной средней величины, после чего в скобках — процентное отношение этого С.К.О. к измеряемой величине):

# nice -n-19 cli -b1 -m1000

SRR client: vers. 1.03

server path: /dev/srr, block size = 1 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

– message exchange: 2693 ~168 {6%}

– manager exchange: 6579 ~357 {5%}

# nice -n-19 cli -b10 -m1000

SRR client: vers. 1.03

server path: /dev/srr, block size = 10 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

– message exchange: 2726 ~258 {9%}

– manager exchange: 6725 ~378 {6%}

# nice -n-19 cli -b100 -m1000

SRR client: vers. 1.03

server path: /dev/srr, block size = 100 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

– message exchange: 3351 ~190 {6%}

– manager exchange: 7055 ~414 {6%}

# nice -n-19 cli -b1000 -m1000

SRR client: vers 1.03

server path: /dev/srr, block size = 1000 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

– message exchange: 3912 ~369 {9%}

– manager exchange: 8312 ~4024 {48%}

# nice -n-19 cli -b4000 -m1000

SRR client: vers 1.03

server path: /dev/srr, block size = 4000 bytes, repeat = 1000

CPU speed [c.p.s.] client = 534639500, server = 534639500

– message exchange: 5393 ~518 {10%}

– manager exchange: 10666 ~770 {7%}

# nice -n-19 cli -b6000 -m1000

SRR client vers 1.03

server path /dev/srr, block size = 6000 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

– message exchange: 7373 ~612 {8%}

– manager exchange: 12423 ~995 {8%}

# nice -n-19 cli -b1000 -m1000

SRR client: vers. 1.03

Поделиться с друзьями: