mirror of https://github.com/koide3/small_gicp.git
92 lines
2.8 KiB
Python
92 lines
2.8 KiB
Python
#!/usr/bin/python3
|
|
import re
|
|
import os
|
|
import numpy
|
|
from matplotlib import pyplot
|
|
from collections import namedtuple
|
|
|
|
def parse_result(filename):
|
|
num_points = []
|
|
results = {}
|
|
|
|
with open(filename, 'r') as f:
|
|
for line in f.readlines():
|
|
matched = re.match(r'num_threads=(\d+)', line)
|
|
if matched:
|
|
num_threads = int(matched.group(1))
|
|
continue
|
|
|
|
matched = re.match(r'num_points=(\d+)', line)
|
|
if matched:
|
|
num_points.append(int(matched.group(1)))
|
|
continue
|
|
|
|
matched = re.match(r'(\S+)_times=(\S+) \+\- (\S+) \(median=(\S+)\)', line)
|
|
if matched:
|
|
method = matched.group(1)
|
|
mean = float(matched.group(2))
|
|
std = float(matched.group(3))
|
|
med = float(matched.group(4))
|
|
|
|
if method not in results:
|
|
results[method] = []
|
|
|
|
results[method].append(med)
|
|
continue
|
|
|
|
return (num_threads, num_points, results)
|
|
|
|
def main():
|
|
results_path = os.path.dirname(__file__) + '/results'
|
|
|
|
results = {}
|
|
for filename in os.listdir(results_path):
|
|
matched = re.match(r'kdtree_benchmark_(\S+)_(\d+).txt', filename)
|
|
if not matched:
|
|
continue
|
|
|
|
method = '{}_{}'.format(matched.group(1), matched.group(2))
|
|
print(method)
|
|
|
|
num_threads, num_points, rets = parse_result(results_path + '/' + filename)
|
|
results[method] = rets[list(rets.keys())[0]]
|
|
|
|
fig, axes = pyplot.subplots(1, 2, figsize=(12, 3))
|
|
|
|
num_threads = [1, 2, 3, 4, 5, 6, 7, 8, 16, 32, 64, 128]
|
|
axes[0].plot(num_points, results['small_1'], label='kdtree (single-thread)', marker='o', linestyle='--')
|
|
for idx in [1, 2, 3, 5, 7, 8, 9]:
|
|
N = num_threads[idx]
|
|
axes[0].plot(num_points, results['omp_{}'.format(N)], label='kdtree_omp (%d threads)' % N, marker='s')
|
|
# axes[0].plot(num_points, results['tbb_{}'.format(N)], label='kdtree_tbb (%d threads)' % N, marker='^')
|
|
|
|
baseline = numpy.array(results['small_1'])
|
|
axes[1].plot([num_threads[0], num_threads[-1]], [1.0, 1.0], label='kdtree (single-thread)', linestyle='--')
|
|
for idx in [5]:
|
|
threads = num_threads[idx]
|
|
N = num_points[idx]
|
|
|
|
axes[1].plot(num_threads, baseline[idx] / [results['omp_{}'.format(threads)][idx] for threads in num_threads], label='omp (num_points=%d)' % N, marker='s')
|
|
axes[1].plot(num_threads, baseline[idx] / [results['tbb_{}'.format(threads)][idx] for threads in num_threads], label='tbb (num_points=%d)' % N, marker='^')
|
|
|
|
axes[1].set_xscale('log')
|
|
|
|
axes[0].set_xlabel('Number of points')
|
|
axes[0].set_ylabel('KdTree construction time [msec/scan]')
|
|
axes[1].set_xlabel('Number of threads = [1, 2, 4, ..., 128]')
|
|
axes[1].set_ylabel('Processing speed ratio (single-thread = 1.0)')
|
|
|
|
axes[0].grid()
|
|
axes[1].grid()
|
|
|
|
axes[0].legend()
|
|
axes[1].legend()
|
|
|
|
fig.savefig('kdtree_time.svg')
|
|
|
|
pyplot.show()
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main() |