summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------Theron0
-rw-r--r--benchmark/bm_registry.py74
-rw-r--r--benchmark/run_benchmarks.py23
-rw-r--r--lib/block_actor.cpp4
4 files changed, 70 insertions, 31 deletions
diff --git a/Theron b/Theron
-Subproject bca3174ae410767c283742cebbb996b745fc40e
+Subproject b2ddbe8b835d6378a1b06ab536f961d7a08912d
diff --git a/benchmark/bm_registry.py b/benchmark/bm_registry.py
index 7c9bb1c..af79a50 100644
--- a/benchmark/bm_registry.py
+++ b/benchmark/bm_registry.py
@@ -6,7 +6,7 @@ def tokwargs(**kwargs): return kwargs
INSTALL_PREFIX = '/opt/usr'
-DURATION = '1.7' #seconds
+DURATION = '1.3' #seconds
GRAS_ENV = {
'PATH': os.path.join(INSTALL_PREFIX, 'gras/bin:$PATH:%s'%os.getenv('PATH')),
@@ -27,8 +27,8 @@ BENCHMARK_MANY_11_BLOCKS = tokwargs(
- GRAS will use only the buffer pool allocator,
and every work will fully consume available buffers.''',
tests = [
- tokwargs(wat='GRAS', args=['tb_many_1_to_1_blocks.py', DURATION], env=GRAS_ENV),
- tokwargs(wat='GR', args=['tb_many_1_to_1_blocks.py', DURATION], env=GR_ENV),
+ tokwargs(wat='GRAS', args=['tb_many_1_to_1_blocks.py', DURATION], env=GRAS_ENV, expand=True),
+ tokwargs(wat='GRSS', args=['tb_many_1_to_1_blocks.py', DURATION], env=GR_ENV),
],
)
@@ -39,40 +39,58 @@ BENCHMARK_MANY_RATE_BLOCKS = tokwargs(
- GRAS will use only the buffer pool allocator,
and every work will fully consume available buffers.''',
tests = [
- tokwargs(wat='GRAS', args=['tb_many_rate_changes.py', '--dur', DURATION], env=GRAS_ENV),
- tokwargs(wat='GR', args=['tb_many_rate_changes.py', '--dur', DURATION], env=GR_ENV),
+ tokwargs(wat='GRAS', args=['tb_many_rate_changes.py', '--dur', DURATION], env=GRAS_ENV, expand=True),
+ tokwargs(wat='GRSS', args=['tb_many_rate_changes.py', '--dur', DURATION], env=GR_ENV),
],
)
-BENCHMARK_FILTER_BLOCK = tokwargs(
- wat='Benchmark the schedulers with a filter block',
+BENCHMARK_DFIR_BLOCK = tokwargs(
+ wat='Benchmark the schedulers with a FIR block',
moar='''\
- Compare filter blocks in each scheduler.
-- Shows both schedulers using circular buffer.
-- The decimating FIR filter is compared.
-- The rational resampler filter is compared.''',
+- Shows both schedulers using circular buffer.''',
tests = [
- tokwargs(wat='GRAS decim FIR', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'dfir'], env=GRAS_ENV),
- tokwargs(wat='GR decim FIR', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'dfir'], env=GR_ENV),
- tokwargs(wat='GRAS resampler', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'resamp'], env=GRAS_ENV),
- tokwargs(wat='GR resampler', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'resamp'], env=GR_ENV),
+ tokwargs(wat='GRAS', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'dfir'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='GRSS', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'dfir'], env=GR_ENV),
],
)
-BENCHMARK_MATH_OPS = tokwargs(
- wat='Benchmark GrExtras vs gr-blocks math blocks',
+BENCHMARK_RESAMP_BLOCK = tokwargs(
+ wat='Benchmark the schedulers with a resampler block',
+ moar='''\
+- Compare filter blocks in each scheduler.
+- Shows both schedulers using circular buffer.''',
+ tests = [
+ tokwargs(wat='GRAS', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'resamp'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='GRSS', args=['tb_filter_block.py', '--dur', DURATION, '--which', 'resamp'], env=GR_ENV),
+ ],
+)
+
+BENCHMARK_ADD_OPS = tokwargs(
+ wat='Benchmark GrExtras vs gr-blocks adder blocks',
+ moar='''\
+- Compare math block implementations using GRAS.
+- All blocks are using vector optimization.
+- GrExtras math blocks avoid an unnecessary memcpy.
+- GrExtras math blocks enable automatic bufer in-placing.''',
+ tests = [
+ tokwargs(wat='GrExtras\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'extras_add'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='gr-blocks\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'blocks_add'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='gr-blocks\n(GRSS)', args=['tb_grextras_math.py', DURATION, 'blocks_add'], env=GR_ENV),
+ ],
+)
+
+BENCHMARK_MULT_OPS = tokwargs(
+ wat='Benchmark GrExtras vs gr-blocks multiplier blocks',
moar='''\
- Compare math block implementations using GRAS.
- All blocks are using vector optimization.
- GrExtras math blocks avoid an unnecessary memcpy.
- GrExtras math blocks enable automatic bufer in-placing.''',
tests = [
- tokwargs(wat='GrExtras Add\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'extras_add'], env=GRAS_ENV),
- tokwargs(wat='gr-blocks Add\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'blocks_add'], env=GRAS_ENV),
- tokwargs(wat='gr-blocks Add\n(GR)', args=['tb_grextras_math.py', DURATION, 'blocks_add'], env=GR_ENV),
- tokwargs(wat='GrExtras Mult\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'extras_mult'], env=GRAS_ENV),
- tokwargs(wat='gr-blocks Mult\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'blocks_mult'], env=GRAS_ENV),
- tokwargs(wat='gr-blocks Mult\n(GR)', args=['tb_grextras_math.py', DURATION, 'blocks_mult'], env=GR_ENV),
+ tokwargs(wat='GrExtras\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'extras_mult'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='gr-blocks\n(GRAS)', args=['tb_grextras_math.py', DURATION, 'blocks_mult'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='gr-blocks\n(GRSS)', args=['tb_grextras_math.py', DURATION, 'blocks_mult'], env=GR_ENV),
],
)
@@ -82,16 +100,18 @@ BENCHMARK_DELAY_BLOCKS = tokwargs(
- Compare delay block implementations using GRAS.
- The GrExtras implementation uses zero-copy.''',
tests = [
- tokwargs(wat='GrExtras Delay\n(GRAS)', args=['tb_grextras_delay.py', DURATION, 'extras_delay'], env=GRAS_ENV),
- tokwargs(wat='gr-core Delay\n(GRAS)', args=['tb_grextras_delay.py', DURATION, 'core_delay'], env=GRAS_ENV),
- tokwargs(wat='gr-core Delay\n(GR)', args=['tb_grextras_delay.py', DURATION, 'core_delay'], env=GR_ENV),
+ tokwargs(wat='GrExtras\n(GRAS)', args=['tb_grextras_delay.py', DURATION, 'extras_delay'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='gr-core\n(GRAS)', args=['tb_grextras_delay.py', DURATION, 'core_delay'], env=GRAS_ENV, expand=True),
+ tokwargs(wat='gr-core\n(GRSS)', args=['tb_grextras_delay.py', DURATION, 'core_delay'], env=GR_ENV),
],
)
BENCHMARKS = (
BENCHMARK_MANY_11_BLOCKS,
BENCHMARK_MANY_RATE_BLOCKS,
- BENCHMARK_FILTER_BLOCK,
- BENCHMARK_MATH_OPS,
+ BENCHMARK_DFIR_BLOCK,
+ BENCHMARK_RESAMP_BLOCK,
+ BENCHMARK_ADD_OPS,
+ BENCHMARK_MULT_OPS,
BENCHMARK_DELAY_BLOCKS,
)
diff --git a/benchmark/run_benchmarks.py b/benchmark/run_benchmarks.py
index 8cb3503..779aa6a 100644
--- a/benchmark/run_benchmarks.py
+++ b/benchmark/run_benchmarks.py
@@ -15,7 +15,7 @@ cpu_count = multiprocessing.cpu_count()
from bm_registry import BENCHMARKS
-NUM_RUNS_PER_TEST = 5
+NUM_RUNS_PER_TEST = 3
BAD_BOOST_KILL_DURATION = 5.0 #seconds
@@ -45,6 +45,25 @@ def run_a_single_one(args, env):
raise Exception, 'no result found!'
#return t1-t0
+def expand_tests(bm):
+ for run in bm['tests']:
+ if run.has_key('expand') and run['expand']:
+ import copy
+ new_run = copy.deepcopy(run)
+ new_run['wat'] += '\n(Block)'
+ new_run['env']['GRAS_YIELD'] = 'BLOCKING'
+ yield new_run
+ new_run = copy.deepcopy(run)
+ new_run['wat'] += '\n(Spin)'
+ new_run['env']['GRAS_YIELD'] = 'STRONG'
+ yield new_run
+ new_run = copy.deepcopy(run)
+ new_run['wat'] += '\n(TPB)'
+ new_run['env']['GRAS_YIELD'] = 'BLOCKING'
+ new_run['env']['GRAS_TPP'] = '1'
+ yield new_run
+ else: yield run
+
def do_a_benchmark(bm):
title = bm['wat']
print '#'*(len(title)+25)
@@ -53,7 +72,7 @@ def do_a_benchmark(bm):
result_means = list()
result_stddevs = list()
test_names = list()
- for run in bm['tests']:
+ for run in expand_tests(bm):
test_name = run['wat']
print '-'*(len(test_name)+25)
print '-- running test:', test_name.replace('\n', ' ')
diff --git a/lib/block_actor.cpp b/lib/block_actor.cpp
index 750e52d..fe7f79e 100644
--- a/lib/block_actor.cpp
+++ b/lib/block_actor.cpp
@@ -14,7 +14,7 @@ ThreadPoolConfig::ThreadPoolConfig(void)
thread_count = std::max(size_t(2), thread_count);
node_mask = 0;
processor_mask = 0xffffffff;
- yield_strategy = "STRONG";
+ yield_strategy = "BLOCKING";
//environment variable override
const char * gras_yield = getenv("GRAS_YIELD");
@@ -44,7 +44,7 @@ ThreadPool::ThreadPool(const ThreadPoolConfig &config)
);
if (config.yield_strategy.empty()) params.mYieldStrategy = Theron::YIELD_STRATEGY_STRONG;
- //else if (config.yield_strategy == "BLOCKING") params.mYieldStrategy = Theron::YIELD_STRATEGY_BLOCKING;
+ else if (config.yield_strategy == "BLOCKING") params.mYieldStrategy = Theron::YIELD_STRATEGY_BLOCKING;
else if (config.yield_strategy == "POLITE") params.mYieldStrategy = Theron::YIELD_STRATEGY_POLITE;
else if (config.yield_strategy == "STRONG") params.mYieldStrategy = Theron::YIELD_STRATEGY_STRONG;
else if (config.yield_strategy == "AGGRESSIVE") params.mYieldStrategy = Theron::YIELD_STRATEGY_AGGRESSIVE;