def benchmark_theory_threads_all(numpart_frac=[ 0.001, 0.005, 0.01, 0.05, 0.1, 0.2, 0.25, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 ], nrepeats=3, keys=None, isa=None): from Corrfunc.theory import DD, DDrppi, wp, xi allkeys = [ #'DD', 'DDrppi', 'wp', 'xi' ] allisa = ['avx512f', 'avx', 'sse42', 'fallback'] if keys is None: keys = allkeys else: for k in keys: if k not in allkeys: msg = "Valid routines to benchmark are: {0}\nFound routine"\ " = {1}".format(allkeys, k) raise ValueError(msg) if isa is None: isa = allisa else: for i in isa: if i not in allisa: msg = "Valid instructions sets benchmark are: {0}\n"\ "Found routine = {1}".format(allisa, i) raise ValueError(msg) numpart_frac = np.array(numpart_frac) print("Benchmarking theory routines {0} for isa = {1}".format(keys, isa)) allx, ally, allz = read_catalog() rmin = 0.1 rmax = 84.0 nbins = 20 bins = np.logspace(np.log10(rmin), np.log10(rmax), nbins) pimax = rmax # Set to rmax for comparisons between wp and xi autocorr = 1 boxsize = 420.0 nthreads = max_threads dtype = np.dtype([('repeat', np.int), ('name', 'U16'), ('isa', 'U16'), ('rmax', np.float), ('ndata', np.int), ('nrand', np.int), ('nthreads', np.int), ('runtime', np.float), ('serial_time', np.float), ('pair_time', np.float), ('api_time', np.float)]) totN = len(numpart_frac) * len(keys) * len(isa) * nrepeats runtimes = np.empty(totN, dtype=dtype) runtimes['nthreads'][:] = nthreads runtimes['rmax'][:] = rmax index = 0 stderr_filename = 'stderr.txt' for run_isa in isa: for frac in numpart_frac: npts = np.int(frac * len(allx)) print("Working with N = {0}".format(npts), file=sys.stderr) x = np.random.choice(allx, npts, replace=False) y = np.random.choice(ally, npts, replace=False) z = np.random.choice(allz, npts, replace=False) start_thread_index = index if 'DD' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = DD(autocorr, nthreads, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'DD' runtimes['repeat'][index] = repeat runtimes['isa'][index] = run_isa runtimes['ndata'][index] = npts runtimes['nrand'][index] = npts runtimes['rmax'][index] = rmax runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 if 'DDrppi' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = DDrppi(autocorr, nthreads, pimax, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'DDrppi' runtimes['isa'][index] = run_isa runtimes['ndata'][index] = npts runtimes['nrand'][index] = npts runtimes['rmax'][index] = rmax runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 if 'wp' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = wp(boxsize, pimax, nthreads, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'wp' runtimes['repeat'][index] = repeat runtimes['isa'][index] = run_isa runtimes['ndata'][index] = npts runtimes['nrand'][index] = npts runtimes['rmax'][index] = rmax runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 if 'xi' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = xi(boxsize, nthreads, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'xi' runtimes['repeat'][index] = repeat runtimes['isa'][index] = run_isa runtimes['ndata'][index] = npts runtimes['nrand'][index] = npts runtimes['rmax'][index] = rmax runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 print("{0}".format(runtimes[start_thread_index:index])) sys.stdout.flush() print("index = {0} totN = {1}".format(index, totN)) # autocorr is always 1 for theory routines -> 'nrand' == 'ndata' runtimes['nrand'][:] = (runtimes['ndata'][:]).copy() return keys, isa, runtimes
def benchmark_theory_threads_all(min_threads=1, max_threads=max_threads, nrepeats=1, keys=None, isa=None): from Corrfunc.theory import DD, DDrppi, wp, xi allkeys = [ #'DDrppi', 'DD', 'wp', 'xi' ] allisa = ['avx', 'sse42', 'fallback'] if keys is None: keys = allkeys else: for k in keys: if k not in allkeys: msg = "Valid routines to benchmark are: {0}\nFound routine"\ " = {1}".format(allkeys, k) raise ValueError(msg) if isa is None: isa = allisa else: for i in isa: if i not in allisa: msg = "Valid instructions sets benchmark are: {0}\n"\ "Found routine = {1}".format(allisa, i) raise ValueError(msg) print("Benchmarking theory routines = {0} with isa = {1}".format( keys, isa)) x, y, z = read_catalog() rmax = 42.0 rmin = 0.1 nbins = 20 bins = np.logspace(np.log10(rmin), np.log10(rmax), nbins) autocorr = 1 pimax = rmax # Set to rmax for comparisons between wp and xi boxsize = 420.0 dtype = np.dtype([('repeat', np.int), ('name', 'S16'), ('isa', 'S16'), ('nthreads', np.int), ('runtime', np.float), ('serial_time', np.float), ('pair_time', np.float), ('api_time', np.float)]) totN = (max_threads - min_threads + 1) * len(keys) * len(isa) * nrepeats runtimes = np.empty(totN, dtype=dtype) index = 0 stderr_filename = 'stderr.txt' for run_isa in isa: for nthreads in range(min_threads, max_threads + 1): print("Working on nthreads = {0}".format(nthreads), file=sys.stderr) start_thread_index = index if 'DD' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = DD(autocorr, nthreads, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'DD' runtimes['isa'][index] = run_isa runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 if 'DDrppi' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = DDrppi(autocorr, nthreads, pimax, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'DDrppi' runtimes['isa'][index] = run_isa runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 if 'wp' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = wp(boxsize, pimax, nthreads, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'wp' runtimes['isa'][index] = run_isa runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 if 'xi' in keys: for repeat in range(nrepeats): runtimes['repeat'][index] = repeat with stderr_redirected(to=stderr_filename): t0 = time.time() _, api_time = xi(boxsize, nthreads, bins, x, y, z, verbose=True, c_api_timer=True, isa=run_isa) t1 = time.time() runtimes['name'][index] = 'xi' runtimes['isa'][index] = run_isa runtimes['nthreads'][index] = nthreads runtimes['runtime'][index] = t1 - t0 serial_time, pair_time = _get_times(stderr_filename) runtimes['serial_time'][index] = serial_time runtimes['pair_time'][index] = pair_time runtimes['api_time'][index] = api_time index += 1 print("{0}".format(runtimes[start_thread_index:index])) sys.stdout.flush() print("index = {0} totN = {1}".format(index, totN)) return keys, isa, runtimes