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/hash_map.hpp>
7 #include <ossia/detail/pod_vector.hpp>
8 #include <ossia/editor/scenario/execution_log.hpp>
9 #include <ossia/editor/scenario/scenario.hpp>
12 #if defined(SCORE_BENCHMARK)
13 #if __has_include(<valgrind/callgrind.h>)
15 #include <QTextStream>
17 #include <valgrind/callgrind.h>
21 struct cycle_count_bench
23 ossia::double_vector& m_tickDurations;
32 :
"=a"(lo),
"=d"(hi));
33 return ((uint64_t)hi << 32) | lo;
38 cycle_count_bench(ossia::double_vector& v)
47 m_tickDurations.push_back(t1 - t0);
51 struct clock_count_bench
53 ossia::double_vector& m_tickDurations;
54 std::chrono::time_point<std::chrono::steady_clock> t0;
56 clock_count_bench(ossia::double_vector& v)
58 , t0{std::chrono::steady_clock::now()}
64 auto t1 = std::chrono::steady_clock::now();
65 m_tickDurations.push_back(
66 std::chrono::duration_cast<std::chrono::nanoseconds>(t1 - t0).count());
69 struct callgrind_bench
71 callgrind_bench() { CALLGRIND_START_INSTRUMENTATION; }
72 ~callgrind_bench() { CALLGRIND_STOP_INSTRUMENTATION; }
83 ossia::execution_state& e;
84 ossia::graph_interface& g;
86 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
88 void operator()(
unsigned long samples,
double)
const
90 std::atomic_thread_fence(std::memory_order_seq_cst);
92 const time_value old_date{e.samples_since_start};
93 e.samples_since_start += samples;
94 const time_value new_date{e.samples_since_start};
97 for(
auto& node : g.get_nodes())
99 token_request{old_date, new_date, 0_tv, 0_tv, 1.0, {}, ossia::root_tempo});
102 std::atomic_thread_fence(std::memory_order_seq_cst);
110 ossia::execution_state& st;
111 ossia::graph_interface& g;
112 ossia::scenario& scenar;
113 ossia::transport_info_fun transport;
115 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
117 void operator()(
unsigned long frameCount,
double seconds)
119 auto& itv = **scenar.get_time_intervals().begin();
120 #if defined(OSSIA_EXECUTION_LOG)
121 auto log = g_exec_log.start_tick();
124 std::atomic_thread_fence(std::memory_order_seq_cst);
126 st.samples_since_start += frameCount;
127 st.bufferSize = (int)frameCount;
129 st.cur_date = seconds * 1e9;
131 const auto flicks = frameCount * st.samplesToModelRatio;
133 ossia::token_request tok{};
134 tok.prev_date = scenar.last_date();
137 if(tok.prev_date == ossia::Infinite)
138 tok.prev_date = 0_tv;
140 tok.date = tok.prev_date + flicks;
143 if(transport.allocated())
145 transport(itv.current_transport_info());
150 #if defined(OSSIA_EXECUTION_LOG)
151 auto log = g_exec_log.start_temporal();
154 scenar.state_impl(tok);
159 #if defined(OSSIA_EXECUTION_LOG)
160 auto log = g_exec_log.start_dataflow();
166 std::atomic_thread_fence(std::memory_order_seq_cst);
170 #if defined(OSSIA_EXECUTION_LOG)
171 auto log = g_exec_log.start_commit();
177 #if defined(OSSIA_SCENARIO_DATAFLOW)
180 scenar.node->requested_tokens.clear();
187 struct precise_score_tick
189 ossia::execution_state& st;
190 ossia::graph_interface& g;
192 ossia::transport_info_fun transport;
194 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
196 void operator()(
unsigned long frameCount,
double seconds)
198 std::atomic_thread_fence(std::memory_order_seq_cst);
200 st.cur_date = seconds * 1e9;
201 for(std::size_t i = 0; i < frameCount; i++)
204 st.samples_since_start++;
205 const ossia::token_request tok{};
208 std::atomic_thread_fence(std::memory_order_seq_cst);
212 std::atomic_thread_fence(std::memory_order_seq_cst);
336 #if defined(SCORE_BENCHMARK)
337 template <
typename BaseTick>
338 struct benchmark_score_tick
341 ossia::double_vector m_tickDurations;
343 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
345 void operator()(
unsigned long frameCount,
double seconds)
347 cycle_count_bench bench{m_tickDurations};
348 base(frameCount, seconds);
350 benchmark_score_tick() { m_tickDurations.reserve(100000); }
351 ~benchmark_score_tick()
353 QFile f(
"/tmp/out.data");
355 f.open(QIODevice::WriteOnly);
356 for(
auto t : m_tickDurations)
The time_interval class.
Definition: time_interval.hpp:49
The time_value class.
Definition: ossia/editor/scenario/time_value.hpp:28