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 for(
auto& node : g.get_nodes())
102 token_request{old_date, new_date, 0_tv, 0_tv, 1.0, {}, ossia::root_tempo});
105 std::atomic_thread_fence(std::memory_order_seq_cst);
113 ossia::execution_state& st;
114 ossia::graph_interface& g;
115 ossia::scenario& scenar;
116 ossia::transport_info_fun transport;
118 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
120 void operator()(
unsigned long frameCount,
double seconds)
122 auto& itv = **scenar.get_time_intervals().begin();
123#if defined(OSSIA_EXECUTION_LOG)
124 auto log = g_exec_log.start_tick();
127 ossia::disable_fpe();
128 std::atomic_thread_fence(std::memory_order_seq_cst);
129 st.bufferSize = (int)frameCount;
131 st.samples_since_start += frameCount;
133 st.cur_date = seconds * 1e9;
135 const auto flicks = frameCount * st.samplesToModelRatio;
137 ossia::token_request tok{};
138 tok.prev_date = scenar.last_date();
141 if(tok.prev_date == ossia::Infinite)
142 tok.prev_date = 0_tv;
144 tok.date = tok.prev_date + flicks;
147 if(transport.allocated())
149 transport(itv.current_transport_info());
154#if defined(OSSIA_EXECUTION_LOG)
155 auto log = g_exec_log.start_temporal();
158 scenar.state_impl(tok);
163#if defined(OSSIA_EXECUTION_LOG)
164 auto log = g_exec_log.start_dataflow();
170 std::atomic_thread_fence(std::memory_order_seq_cst);
174#if defined(OSSIA_EXECUTION_LOG)
175 auto log = g_exec_log.start_commit();
181#if defined(OSSIA_SCENARIO_DATAFLOW)
184 scenar.node->requested_tokens.clear();
191struct precise_score_tick
193 ossia::execution_state& st;
194 ossia::graph_interface& g;
196 ossia::transport_info_fun transport;
198 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
200 void operator()(
unsigned long frameCount,
double seconds)
202 ossia::disable_fpe();
203 std::atomic_thread_fence(std::memory_order_seq_cst);
205 st.cur_date = seconds * 1e9;
206 for(std::size_t i = 0; i < frameCount; i++)
209 st.samples_since_start++;
210 const ossia::token_request tok{};
213 std::atomic_thread_fence(std::memory_order_seq_cst);
217 std::atomic_thread_fence(std::memory_order_seq_cst);
342#if defined(SCORE_BENCHMARK)
343template <
typename BaseTick>
344struct benchmark_score_tick
347 ossia::double_vector m_tickDurations;
349 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
351 void operator()(
unsigned long frameCount,
double seconds)
353 cycle_count_bench bench{m_tickDurations};
354 base(frameCount, seconds);
356 benchmark_score_tick() { m_tickDurations.reserve(100000); }
357 ~benchmark_score_tick()
359 QFile f(
"/tmp/out.data");
361 f.open(QIODevice::WriteOnly);
362 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:30