|
Ginkgo
Generated from pipelines/1068515030 branch based on master. Ginkgo version 1.7.0
A numerical linear algebra library targeting many-core architectures
|
33 #ifndef GKO_PUBLIC_CORE_LOG_PAPI_HPP_
34 #define GKO_PUBLIC_CORE_LOG_PAPI_HPP_
37 #include <ginkgo/config.hpp>
50 #include <ginkgo/core/base/polymorphic_object.hpp>
51 #include <ginkgo/core/log/logger.hpp>
59 static std::mutex papi_count_mutex;
86 template <
typename ValueType = default_precision>
91 const size_type& num_bytes)
const override;
95 const uintptr& location)
const override;
98 const uintptr& location)
const override;
101 const uintptr& location)
const override;
106 const size_type& num_bytes)
const override;
111 const size_type& num_bytes)
const override;
149 const LinOp* x)
const override;
152 const LinOp* x)
const override;
156 const LinOp* x)
const override;
160 const LinOp* x)
const override;
164 const LinOp* input)
const override;
168 const LinOp* output)
const override;
172 const LinOp* residual,
const LinOp* residual_norm,
173 const LinOp* solution,
const uint8& stopping_id,
175 const bool& one_changed,
const bool& all_converged)
const override;
180 const LinOp* residual,
181 const LinOp* residual_norm,
182 const LinOp* implicit_resnorm_sq,
184 bool stopped)
const override;
187 "Please use the version with the additional stopping "
192 const LinOp* residual_norm)
const override;
195 "Please use the version with the additional stopping "
200 const LinOp* residual_norm,
201 const LinOp* implicit_sq_residual_norm)
const override;
208 GKO_DEPRECATED(
"use single-parameter create")
224 return std::shared_ptr<Papi>(
new Papi(enabled_events), [](
auto logger) {
227 papi_sde_shutdown(handle);
244 const papi_handle_t
get_handle()
const {
return papi_handle; }
247 GKO_DEPRECATED(
"use single-parameter constructor")
251 :
Papi(enabled_events)
256 : Logger(enabled_events)
258 std::ostringstream os;
260 std::lock_guard<std::mutex> guard(papi_count_mutex);
261 os <<
"ginkgo" << papi_logger_count;
263 papi_handle = papi_sde_init(name.c_str());
268 template <
typename Po
interType>
271 papi_queue(papi_handle_t* handle,
const char* counter_name)
272 : handle{handle}, counter_name{counter_name}
277 for (
auto e : data) {
278 std::ostringstream oss;
279 oss << counter_name <<
"::" << e.first;
280 papi_sde_unregister_counter(*handle, oss.str().c_str());
285 size_type& get_counter(
const PointerType* ptr)
287 const auto tmp = reinterpret_cast<uintptr>(ptr);
288 if (data.find(tmp) == data.end()) {
291 auto& value = data[tmp];
293 std::ostringstream oss;
294 oss << counter_name <<
"::" << tmp;
295 papi_sde_register_counter(*handle, oss.str().c_str(),
296 PAPI_SDE_RO | PAPI_SDE_INSTANT,
297 PAPI_SDE_long_long, &value);
303 papi_handle_t* handle;
304 const char* counter_name;
305 std::map<std::uintptr_t, size_type> data;
309 mutable papi_queue<Executor> allocation_started{&papi_handle,
310 "allocation_started"};
311 mutable papi_queue<Executor> allocation_completed{&papi_handle,
312 "allocation_completed"};
313 mutable papi_queue<Executor> free_started{&papi_handle,
"free_started"};
314 mutable papi_queue<Executor> free_completed{&papi_handle,
"free_completed"};
315 mutable papi_queue<Executor> copy_started_from{&papi_handle,
316 "copy_started_from"};
317 mutable papi_queue<Executor> copy_started_to{&papi_handle,
319 mutable papi_queue<Executor> copy_completed_from{&papi_handle,
320 "copy_completed_from"};
321 mutable papi_queue<Executor> copy_completed_to{&papi_handle,
322 "copy_completed_to"};
324 mutable papi_queue<Executor> operation_launched{&papi_handle,
325 "operation_launched"};
326 mutable papi_queue<Executor> operation_completed{&papi_handle,
327 "operation_completed"};
329 mutable papi_queue<Executor> polymorphic_object_create_started{
330 &papi_handle,
"polymorphic_object_create_started"};
331 mutable papi_queue<Executor> polymorphic_object_create_completed{
332 &papi_handle,
"polymorphic_object_create_completed"};
333 mutable papi_queue<Executor> polymorphic_object_copy_started{
334 &papi_handle,
"polymorphic_object_copy_started"};
335 mutable papi_queue<Executor> polymorphic_object_copy_completed{
336 &papi_handle,
"polymorphic_object_copy_completed"};
337 mutable papi_queue<Executor> polymorphic_object_move_started{
338 &papi_handle,
"polymorphic_object_move_started"};
339 mutable papi_queue<Executor> polymorphic_object_move_completed{
340 &papi_handle,
"polymorphic_object_move_completed"};
341 mutable papi_queue<Executor> polymorphic_object_deleted{
342 &papi_handle,
"polymorphic_object_deleted"};
344 mutable papi_queue<LinOpFactory> linop_factory_generate_started{
345 &papi_handle,
"linop_factory_generate_started"};
346 mutable papi_queue<LinOpFactory> linop_factory_generate_completed{
347 &papi_handle,
"linop_factory_generate_completed"};
349 mutable papi_queue<LinOp> linop_apply_started{&papi_handle,
350 "linop_apply_started"};
351 mutable papi_queue<LinOp> linop_apply_completed{&papi_handle,
352 "linop_apply_completed"};
353 mutable papi_queue<LinOp> linop_advanced_apply_started{
354 &papi_handle,
"linop_advanced_apply_started"};
355 mutable papi_queue<LinOp> linop_advanced_apply_completed{
356 &papi_handle,
"linop_advanced_apply_completed"};
358 mutable std::map<std::uintptr_t, void*> criterion_check_completed;
360 mutable papi_queue<LinOp> iteration_complete{&papi_handle,
361 "iteration_complete"};
364 std::string name{
"ginkgo"};
365 papi_handle_t papi_handle;
373 #endif // GKO_HAVE_PAPI_SDE
374 #endif // GKO_PUBLIC_CORE_LOG_PAPI_HPP_
void on_iteration_complete(const LinOp *solver, const LinOp *b, const LinOp *x, const size_type &num_iterations, const LinOp *residual, const LinOp *residual_norm, const LinOp *implicit_resnorm_sq, const array< stopping_status > *status, bool stopped) const override
Register the iteration_complete event which logs every completed iterations.
std::uint8_t uint8
8-bit unsigned integral type.
Definition: types.hpp:149
void on_linop_advanced_apply_completed(const LinOp *A, const LinOp *alpha, const LinOp *b, const LinOp *beta, const LinOp *x) const override
LinOp's advanced apply completed event.
Definition: lin_op.hpp:146
void on_operation_completed(const Executor *exec, const Operation *operation) const override
Executor's operation completed event (method run).
void on_operation_launched(const Executor *exec, const Operation *operation) const override
Executor's operation launched event (method run).
A PolymorphicObject is the abstract base for all "heavy" objects in Ginkgo that behave polymorphicall...
Definition: polymorphic_object.hpp:72
void on_polymorphic_object_create_started(const Executor *, const PolymorphicObject *po) const override
PolymorphicObject's create started event.
void on_allocation_completed(const Executor *exec, const size_type &num_bytes, const uintptr &location) const override
Executor's allocation completed event.
void on_linop_factory_generate_started(const LinOpFactory *factory, const LinOp *input) const override
LinOp Factory's generate started event.
Stopping criterion events.
std::uintptr_t uintptr
Unsigned integer type capable of holding a pointer to void.
Definition: types.hpp:172
void on_polymorphic_object_move_completed(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's move completed event.
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:120
void on_polymorphic_object_copy_started(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's copy started event.
static std::shared_ptr< Papi > create(std::shared_ptr< const gko::Executor >, const Logger::mask_type &enabled_events=Logger::all_events_mask)
Creates a Papi Logger.
Definition: papi.hpp:209
void on_copy_completed(const Executor *from, const Executor *to, const uintptr &location_from, const uintptr &location_to, const size_type &num_bytes) const override
Executor's copy completed event.
The Ginkgo namespace.
Definition: abstract_factory.hpp:48
const std::string get_handle_name() const
Returns the unique name of this logger, which can be used in the PAPI_read() call.
Definition: papi.hpp:237
static std::shared_ptr< Papi > create(const Logger::mask_type &enabled_events=Logger::all_events_mask)
Creates a Papi Logger.
Definition: papi.hpp:221
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition: array.hpp:55
void on_copy_started(const Executor *from, const Executor *to, const uintptr &location_from, const uintptr &location_to, const size_type &num_bytes) const override
Executor's copy started event.
static constexpr mask_type all_events_mask
Bitset Mask which activates all events.
Definition: logger.hpp:117
void on_polymorphic_object_copy_completed(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's copy completed event.
const papi_handle_t get_handle() const
Returns the corresponding papi_handle_t for this logger.
Definition: papi.hpp:244
void on_linop_advanced_apply_started(const LinOp *A, const LinOp *alpha, const LinOp *b, const LinOp *beta, const LinOp *x) const override
LinOp's advanced apply started event.
Definition: logger.hpp:104
void on_linop_factory_generate_completed(const LinOpFactory *factory, const LinOp *input, const LinOp *output) const override
LinOp Factory's generate completed event.
Papi is a Logger which logs every event to the PAPI software.
Definition: papi.hpp:87
void on_polymorphic_object_move_started(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's move started event.
The Criterion class is a base class for all stopping criteria.
Definition: criterion.hpp:64
void on_polymorphic_object_deleted(const Executor *exec, const PolymorphicObject *po) const override
PolymorphicObject's deleted event.
void on_allocation_started(const Executor *exec, const size_type &num_bytes) const override
Executor's allocation started event.
void on_criterion_check_completed(const stop::Criterion *criterion, const size_type &num_iterations, const LinOp *residual, const LinOp *residual_norm, const LinOp *solution, const uint8 &stopping_id, const bool &set_finalized, const array< stopping_status > *status, const bool &one_changed, const bool &all_converged) const override
stop::Criterion's check completed event.
void on_polymorphic_object_create_completed(const Executor *exec, const PolymorphicObject *input, const PolymorphicObject *output) const override
PolymorphicObject's create completed event.
Kernel execution and data movement.
The first step in using the Ginkgo library consists of creating an executor.
Definition: executor.hpp:644
void on_free_started(const Executor *exec, const uintptr &location) const override
Executor's free started event.
void on_linop_apply_completed(const LinOp *A, const LinOp *b, const LinOp *x) const override
LinOp's apply completed event.
A LinOpFactory represents a higher order mapping which transforms one linear operator into another.
Definition: lin_op.hpp:413
void on_linop_apply_started(const LinOp *A, const LinOp *b, const LinOp *x) const override
LinOp's apply started event.
Operations can be used to define functionalities whose implementations differ among devices.
Definition: executor.hpp:287
void on_free_completed(const Executor *exec, const uintptr &location) const override
Executor's free completed event.