File logger.h
Go to the documentation of this file
#pragma once
#include <muda/muda_def.h>
#include <muda/check/check_cuda_errors.h>
#include <cinttypes>
#include <muda/literal/unit.h>
#include <muda/logger/logger_viewer.h>
#include <muda/buffer/device_var.h>
#include <vector>
#include <muda/tools/temp_buffer.h>
namespace muda
{
class LoggerMetaData
{
  public:
    uint32_t        id;
    LoggerBasicType type;
    void*           data;
    LoggerFmtArg    fmt_arg;
    template <typename T>
    const T& as();
};
class LoggerDataContainer
{
  public:
    span<LoggerMetaData> meta_data() { return m_meta_data; }
  private:
    friend class Logger;
    std::vector<LoggerMetaData> m_meta_data;
    std::vector<char>           m_buffer;
};
class Logger
{
    static constexpr size_t DEFAULT_META_SIZE   = 16_M;
    static constexpr size_t DEFAULT_BUFFER_SIZE = 128_M;
  public:
    Logger(LoggerViewer* global_viewer,
           size_t        meta_size   = DEFAULT_META_SIZE,
           size_t        buffer_size = DEFAULT_BUFFER_SIZE);
    Logger(size_t meta_size = DEFAULT_META_SIZE, size_t buffer_size = DEFAULT_BUFFER_SIZE)
        : Logger(nullptr, meta_size, buffer_size)
    {
    }
    ~Logger();
    // delete copy
    Logger(const Logger&)            = delete;
    Logger& operator=(const Logger&) = delete;
    // allow move
    Logger(Logger&&) noexcept;
    Logger& operator=(Logger&&) noexcept;
    void retrieve(std::ostream& o = std::cout);
    MUDA_NODISCARD LoggerDataContainer retrieve_meta();
    MUDA_NODISCARD bool is_meta_data_full() const
    {
        return m_h_offset.exceed_meta_data;
    }
    MUDA_NODISCARD bool is_buffer_full() const
    {
        return m_h_offset.exceed_buffer;
    }
    MUDA_NODISCARD LoggerViewer viewer() const
    {
        return m_log_viewer_ptr ? *m_log_viewer_ptr : m_viewer;
    }
  private:
    friend class LaunchCore;
    friend class Debug;
    void expand_meta_data();
    void expand_buffer();
    void upload();
    void download();
    void expand_if_needed();
    //details::LoggerMetaData* m_meta_data;
    //size_t                   m_meta_data_size;
    details::TempBuffer<uint32_t>                m_sorted_meta_data_id;
    details::TempBuffer<details::LoggerMetaData> m_sorted_meta_data;
    details::TempBuffer<uint32_t>                m_meta_data_id;
    details::TempBuffer<details::LoggerMetaData> m_meta_data;
    std::vector<details::LoggerMetaData> m_h_meta_data;
    //char*              m_buffer;
    //size_t             m_buffer_size;
    details::TempBuffer<char> m_buffer;
    std::vector<char>         m_h_buffer;
    //details::LoggerOffset*           m_offset;
    details::TempBuffer<details::LoggerOffset> m_offset;
    details::LoggerOffset                      m_h_offset;
    LoggerViewer* m_log_viewer_ptr = nullptr;
    LoggerViewer  m_viewer;
    template <typename F>
    void _retrieve(F&&);
    void put(std::ostream& os, const details::LoggerMetaData& meta_data) const;
};
//MUDA_INLINE __device__ LoggerViewer cout;
}  // namespace muda
#include <muda/logger/details/logger.inl>