2020-03-26 10:23:57 +00:00
|
|
|
#!/usr/bin/env perl
|
|
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
|
use strict;
|
|
|
|
|
use IO::Socket;
|
|
|
|
|
use IO::Socket::INET;
|
2020-04-06 16:19:29 +00:00
|
|
|
use Getopt::Long;
|
2020-03-26 10:23:57 +00:00
|
|
|
|
|
|
|
|
$| = 1; # autoflush
|
|
|
|
|
|
2020-04-15 07:50:25 +00:00
|
|
|
sub clamp {
|
|
|
|
|
my ($start, $end) = @_;
|
|
|
|
|
my @clamped = (0, 0);
|
|
|
|
|
|
|
|
|
|
$clamped[0] = $start < 0.9375 ? 0.9375 : $start;
|
|
|
|
|
$clamped[1] = $end > 960 ? 960 : $end;
|
|
|
|
|
|
|
|
|
|
return @clamped;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-26 10:23:57 +00:00
|
|
|
sub send_benchmark {
|
2020-04-20 06:37:11 +00:00
|
|
|
my ($lib, $addr, $port, $iter, $threads, $start, $end, $gen_recv) = @_;
|
2020-04-15 07:50:25 +00:00
|
|
|
my ($sfps, $efps) = clamp($start, $end);
|
2020-04-08 12:01:37 +00:00
|
|
|
my ($socket, $remote, $data);
|
2020-03-26 10:23:57 +00:00
|
|
|
|
|
|
|
|
$socket = IO::Socket::INET->new(
|
2020-04-08 11:57:49 +00:00
|
|
|
LocalAddr => $addr,
|
2020-03-26 10:23:57 +00:00
|
|
|
LocalPort => $port,
|
|
|
|
|
Proto => "tcp",
|
|
|
|
|
Type => SOCK_STREAM,
|
|
|
|
|
Listen => 1,
|
|
|
|
|
) or die "Couldn't connect to $addr:$port : $@\n";
|
|
|
|
|
|
|
|
|
|
$remote = $socket->accept();
|
|
|
|
|
|
2020-04-06 16:19:29 +00:00
|
|
|
while ($threads ne 0) {
|
2020-04-15 07:50:25 +00:00
|
|
|
for (my $i = $sfps; $i <= $efps; $i *= 2) {
|
2020-04-15 07:20:48 +00:00
|
|
|
my $logname = "send_results_$threads" . "threads_$i". "fps";
|
2020-04-06 16:19:29 +00:00
|
|
|
for ((1 .. $iter)) {
|
|
|
|
|
$remote->recv($data, 16);
|
2020-04-15 07:35:16 +00:00
|
|
|
system ("time ./$lib/sender $addr $threads $i >> $lib/results/$logname 2>&1");
|
2020-04-20 06:37:11 +00:00
|
|
|
$remote->send("end") if $gen_recv;
|
2020-04-06 16:19:29 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$threads--;
|
2020-03-26 10:23:57 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub recv_benchmark {
|
2020-04-15 07:20:48 +00:00
|
|
|
my ($lib, $addr, $port, $iter, $threads, $start, $end) = @_;
|
2020-04-15 07:50:25 +00:00
|
|
|
my ($sfps, $efps) = clamp($start, $end);
|
2020-03-26 10:23:57 +00:00
|
|
|
|
|
|
|
|
my $socket = IO::Socket::INET->new(
|
|
|
|
|
PeerAddr => $addr,
|
|
|
|
|
PeerPort => $port,
|
|
|
|
|
Proto => "tcp",
|
|
|
|
|
Type => SOCK_STREAM,
|
|
|
|
|
Timeout => 1,
|
|
|
|
|
) or die "Couldn't connect to $addr:$port : $@\n";
|
|
|
|
|
|
2020-04-06 16:19:29 +00:00
|
|
|
while ($threads ne 0) {
|
2020-04-15 07:50:25 +00:00
|
|
|
for (my $i = $sfps; $i <= $efps; $i *= 2) {
|
2020-04-15 07:20:48 +00:00
|
|
|
my $logname = "recv_results_$threads" . "threads_$i". "fps";
|
2020-04-06 16:19:29 +00:00
|
|
|
for ((1 .. $iter)) {
|
|
|
|
|
$socket->send("start");
|
2020-04-15 07:35:16 +00:00
|
|
|
system ("time ./$lib/receiver $addr $threads >> $lib/results/$logname 2>&1");
|
2020-04-06 16:19:29 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$threads--;
|
2020-03-26 10:23:57 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-20 06:37:11 +00:00
|
|
|
# use netcat to capture the stream
|
|
|
|
|
sub recv_generic {
|
|
|
|
|
my ($lib, $addr, $port, $iter, $threads, $start, $end) = @_;
|
|
|
|
|
my ($sfps, $efps) = clamp($start, $end);
|
|
|
|
|
my $ports = "";
|
|
|
|
|
|
|
|
|
|
my $socket = IO::Socket::INET->new(
|
|
|
|
|
PeerAddr => $addr,
|
|
|
|
|
PeerPort => $port,
|
|
|
|
|
Proto => "tcp",
|
|
|
|
|
Type => SOCK_STREAM,
|
|
|
|
|
Timeout => 1,
|
|
|
|
|
) or die "Couldn't connect to $addr:$port : $@\n";
|
|
|
|
|
|
|
|
|
|
# spawn N netcats using gnu parallel, send message to sender to start sending,
|
|
|
|
|
# wait for message from sender that all the packets have been sent, sleep a tiny bit
|
|
|
|
|
# move receiver output from separate files to one common file and proceed to next iteration
|
|
|
|
|
|
|
|
|
|
for (my $i = 0; $i < $threads; ++$i) {
|
|
|
|
|
$ports .= 8888 + $i * 2 . " ";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while ($threads ne 0) {
|
|
|
|
|
for (my $i = $sfps; $i <= $efps; $i *= 2) {
|
|
|
|
|
system "parallel --files nc -kluvw 0 $addr ::: $ports &";
|
|
|
|
|
$socket->send("start");
|
|
|
|
|
$socket->recv(my $data, 16);
|
|
|
|
|
sleep 1;
|
|
|
|
|
system "killall nc";
|
|
|
|
|
# TODO parse output
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$threads--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-06 16:19:29 +00:00
|
|
|
GetOptions(
|
|
|
|
|
"lib=s" => \(my $lib = ""),
|
|
|
|
|
"role=s" => \(my $role = ""),
|
|
|
|
|
"addr=s" => \(my $addr = ""),
|
|
|
|
|
"port=i" => \(my $port = 0),
|
|
|
|
|
"iter=i" => \(my $iter = 100),
|
|
|
|
|
"threads=i" => \(my $threads = 1),
|
2020-04-15 07:20:48 +00:00
|
|
|
"start=f" => \(my $start = 0),
|
|
|
|
|
"end=f" => \(my $end = 0),
|
2020-04-20 06:37:11 +00:00
|
|
|
"use-nc" => \(my $nc = 0)
|
2020-04-06 16:19:29 +00:00
|
|
|
) or die "failed to parse command line!\n";
|
|
|
|
|
|
|
|
|
|
if ($lib eq "") {
|
|
|
|
|
print "library not defined!\n" and exit;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-15 07:20:48 +00:00
|
|
|
if (!$start or !$end) {
|
|
|
|
|
print "start and end FPS values must be defined!\n" and exit;
|
2020-04-06 16:19:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($addr eq "" or $port eq 0) {
|
|
|
|
|
print "address and port must be defined!\n" and exit;
|
2020-03-26 10:23:57 +00:00
|
|
|
}
|
|
|
|
|
|
2020-04-06 16:19:29 +00:00
|
|
|
if ($role eq "send") {
|
|
|
|
|
system ("make $lib" . "_sender");
|
2020-04-20 06:37:11 +00:00
|
|
|
send_benchmark($lib, $addr, $port, $iter, $threads, $start, $end, $nc);
|
|
|
|
|
} elsif ($role eq "recv" ) {
|
|
|
|
|
if (!$nc) {
|
|
|
|
|
system ("make $lib" . "_receiver");
|
|
|
|
|
recv_benchmark($lib, $addr, $port, $iter, $threads, $start, $end);
|
|
|
|
|
} else {
|
|
|
|
|
recv_generic($lib, $addr, $port, $iter, $threads, $start, $end);
|
|
|
|
|
}
|
2020-03-26 10:23:57 +00:00
|
|
|
} else {
|
2020-04-06 16:19:29 +00:00
|
|
|
print "invalid role: '$role'\n" and exit;
|
2020-03-26 10:23:57 +00:00
|
|
|
}
|