2#include <ossia/audio/audio_tick.hpp>
3#include <ossia/dataflow/execution_state.hpp>
4#include <ossia/dataflow/graph/graph_interface.hpp>
5#include <ossia/dataflow/graph_node.hpp>
6#include <ossia/detail/disable_fpe.hpp>
7#include <ossia/detail/hash_map.hpp>
8#include <ossia/detail/pod_vector.hpp>
9#include <ossia/editor/scenario/execution_log.hpp>
10#include <ossia/editor/scenario/scenario.hpp>
13#if defined(SCORE_BENCHMARK)
14#if __has_include(<valgrind/callgrind.h>)
18#include <valgrind/callgrind.h>
22struct cycle_count_bench
24 ossia::double_vector& m_tickDurations;
33 :
"=a"(lo),
"=d"(hi));
34 return ((uint64_t)hi << 32) | lo;
39 cycle_count_bench(ossia::double_vector& v)
48 m_tickDurations.push_back(t1 - t0);
52struct clock_count_bench
54 ossia::double_vector& m_tickDurations;
55 std::chrono::time_point<std::chrono::steady_clock> t0;
57 clock_count_bench(ossia::double_vector& v)
59 , t0{std::chrono::steady_clock::now()}
65 auto t1 = std::chrono::steady_clock::now();
66 m_tickDurations.push_back(
67 std::chrono::duration_cast<std::chrono::nanoseconds>(t1 - t0).count());
72 callgrind_bench() { CALLGRIND_START_INSTRUMENTATION; }
73 ~callgrind_bench() { CALLGRIND_STOP_INSTRUMENTATION; }
84 ossia::execution_state& e;
85 ossia::graph_interface& g;
87 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
89 void operator()(
unsigned long samples,
double)
const
92 std::atomic_thread_fence(std::memory_order_seq_cst);
93 e.bufferSize = (int)samples;
95 const time_value old_date{e.samples_since_start};
96 e.samples_since_start += samples;
97 const time_value new_date{e.samples_since_start};
100 token_request tok{old_date, new_date, 0_tv, 0_tv, 1.0, {}, ossia::root_tempo};
101 tok.start_sample = 0;
102 tok.length_sample = int32_t(samples);
103 for(
auto& node : g.get_nodes())
107 std::atomic_thread_fence(std::memory_order_seq_cst);
115 ossia::execution_state& st;
116 ossia::graph_interface& g;
117 ossia::scenario& scenar;
118 ossia::transport_info_fun transport;
120 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
122 void operator()(
unsigned long frameCount,
double seconds)
124 auto& itv = **scenar.get_time_intervals().begin();
125#if defined(OSSIA_EXECUTION_LOG)
126 auto log = g_exec_log.start_tick();
129 ossia::disable_fpe();
130 std::atomic_thread_fence(std::memory_order_seq_cst);
131 st.bufferSize = (int)frameCount;
133 st.samples_since_start += frameCount;
135 st.cur_date = seconds * 1e9;
137 const auto flicks = frameCount * st.samplesToModelRatio;
139 ossia::token_request tok{};
140 tok.prev_date = scenar.last_date();
143 if(tok.prev_date == ossia::Infinite)
144 tok.prev_date = 0_tv;
146 tok.date = tok.prev_date + flicks;
151 tok.start_sample = 0;
152 tok.length_sample = int32_t(frameCount);
155 if(transport.allocated())
157 transport(itv.current_transport_info());
162#if defined(OSSIA_EXECUTION_LOG)
163 auto log = g_exec_log.start_temporal();
166 scenar.state_impl(tok);
171#if defined(OSSIA_EXECUTION_LOG)
172 auto log = g_exec_log.start_dataflow();
178 std::atomic_thread_fence(std::memory_order_seq_cst);
182#if defined(OSSIA_EXECUTION_LOG)
183 auto log = g_exec_log.start_commit();
189#if defined(OSSIA_SCENARIO_DATAFLOW)
192 scenar.node->requested_tokens.clear();
199struct precise_score_tick
201 ossia::execution_state& st;
202 ossia::graph_interface& g;
204 ossia::transport_info_fun transport;
206 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
208 void operator()(
unsigned long frameCount,
double seconds)
210 ossia::disable_fpe();
211 std::atomic_thread_fence(std::memory_order_seq_cst);
213 st.cur_date = seconds * 1e9;
214 for(std::size_t i = 0; i < frameCount; i++)
217 st.samples_since_start++;
218 const ossia::token_request tok{};
221 std::atomic_thread_fence(std::memory_order_seq_cst);
225 std::atomic_thread_fence(std::memory_order_seq_cst);
350#if defined(SCORE_BENCHMARK)
351template <
typename BaseTick>
352struct benchmark_score_tick
355 ossia::double_vector m_tickDurations;
357 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
359 void operator()(
unsigned long frameCount,
double seconds)
361 cycle_count_bench bench{m_tickDurations};
362 base(frameCount, seconds);
364 benchmark_score_tick() { m_tickDurations.reserve(100000); }
365 ~benchmark_score_tick()
367 QFile f(
"/tmp/out.data");
369 f.open(QIODevice::WriteOnly);
370 for(
auto t : m_tickDurations)
The time_interval class.
Definition time_interval.hpp:49
void tick_offset(ossia::time_value, ossia::time_value offset, const ossia::token_request &parent_request, int32_t start_sample=-1, int32_t length_sample=-1)
Definition time_interval.cpp:272
The time_value class.
Definition ossia/editor/scenario/time_value.hpp:30