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);
94 const time_value old_date{e.samples_since_start};
95 e.samples_since_start += samples;
96 const time_value new_date{e.samples_since_start};
99 for(
auto& node : g.get_nodes())
101 token_request{old_date, new_date, 0_tv, 0_tv, 1.0, {}, ossia::root_tempo});
104 std::atomic_thread_fence(std::memory_order_seq_cst);
112 ossia::execution_state& st;
113 ossia::graph_interface& g;
114 ossia::scenario& scenar;
115 ossia::transport_info_fun transport;
117 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
119 void operator()(
unsigned long frameCount,
double seconds)
121 auto& itv = **scenar.get_time_intervals().begin();
122#if defined(OSSIA_EXECUTION_LOG)
123 auto log = g_exec_log.start_tick();
126 ossia::disable_fpe();
127 std::atomic_thread_fence(std::memory_order_seq_cst);
129 st.samples_since_start += frameCount;
130 st.bufferSize = (int)frameCount;
132 st.cur_date = seconds * 1e9;
134 const auto flicks = frameCount * st.samplesToModelRatio;
136 ossia::token_request tok{};
137 tok.prev_date = scenar.last_date();
140 if(tok.prev_date == ossia::Infinite)
141 tok.prev_date = 0_tv;
143 tok.date = tok.prev_date + flicks;
146 if(transport.allocated())
148 transport(itv.current_transport_info());
153#if defined(OSSIA_EXECUTION_LOG)
154 auto log = g_exec_log.start_temporal();
157 scenar.state_impl(tok);
162#if defined(OSSIA_EXECUTION_LOG)
163 auto log = g_exec_log.start_dataflow();
169 std::atomic_thread_fence(std::memory_order_seq_cst);
173#if defined(OSSIA_EXECUTION_LOG)
174 auto log = g_exec_log.start_commit();
180#if defined(OSSIA_SCENARIO_DATAFLOW)
183 scenar.node->requested_tokens.clear();
190struct precise_score_tick
192 ossia::execution_state& st;
193 ossia::graph_interface& g;
195 ossia::transport_info_fun transport;
197 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
199 void operator()(
unsigned long frameCount,
double seconds)
201 ossia::disable_fpe();
202 std::atomic_thread_fence(std::memory_order_seq_cst);
204 st.cur_date = seconds * 1e9;
205 for(std::size_t i = 0; i < frameCount; i++)
208 st.samples_since_start++;
209 const ossia::token_request tok{};
212 std::atomic_thread_fence(std::memory_order_seq_cst);
216 std::atomic_thread_fence(std::memory_order_seq_cst);
341#if defined(SCORE_BENCHMARK)
342template <
typename BaseTick>
343struct benchmark_score_tick
346 ossia::double_vector m_tickDurations;
348 void operator()(
const ossia::audio_tick_state& st) { (*this)(st.frames, st.seconds); }
350 void operator()(
unsigned long frameCount,
double seconds)
352 cycle_count_bench bench{m_tickDurations};
353 base(frameCount, seconds);
355 benchmark_score_tick() { m_tickDurations.reserve(100000); }
356 ~benchmark_score_tick()
358 QFile f(
"/tmp/out.data");
360 f.open(QIODevice::WriteOnly);
361 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