ClickHouse/src/Compression/CompressionCodecDeflateQpl.h

121 lines
3.8 KiB
C++
Raw Normal View History

#pragma once
#include <Compression/ICompressionCodec.h>
#include <qpl/qpl.h>
2022-07-09 16:03:25 +00:00
#include <random>
2022-07-07 14:04:17 +00:00
namespace Poco
{
class Logger;
}
namespace DB
{
2022-07-09 18:42:01 +00:00
/// DeflateQplJobHWPool is resource pool for provide the job objects which is required to save context infomation during offload asynchronous compression to IAA.
class DeflateQplJobHWPool
{
public:
2022-07-09 18:42:01 +00:00
DeflateQplJobHWPool();
~DeflateQplJobHWPool();
2022-07-07 21:13:20 +00:00
bool & jobPoolReady() { return job_pool_ready;}
2022-07-09 18:57:38 +00:00
qpl_job * acquireJob(uint32_t * job_id);
qpl_job * releaseJob(uint32_t job_id);
2022-07-09 21:50:57 +00:00
static DeflateQplJobHWPool & instance();
private:
2022-07-09 18:57:38 +00:00
bool tryLockJob(size_t index);
2022-07-09 21:17:18 +00:00
void unLockJob(uint32_t index) { hw_job_ptr_locks[index].store(false); }
2022-07-07 21:13:20 +00:00
class ReleaseJobObjectGuard
{
uint32_t index;
ReleaseJobObjectGuard() = delete;
public:
2022-07-09 18:57:38 +00:00
ReleaseJobObjectGuard(const uint32_t index_) : index(index_){}
2022-07-09 21:17:18 +00:00
~ReleaseJobObjectGuard(){ hw_job_ptr_locks[index].store(false); }
};
2022-07-09 18:57:38 +00:00
2022-07-09 21:50:57 +00:00
static constexpr auto JOB_NUMBER = 1024;
static constexpr qpl_path_t PATH = qpl_path_hardware;
static qpl_job * hw_job_ptr_pool[JOB_NUMBER];
static std::atomic_bool hw_job_ptr_locks[JOB_NUMBER];
static bool job_pool_ready;
static std::unique_ptr<uint8_t[]> hw_job_buffer;
Poco::Logger * log;
2022-07-09 16:03:25 +00:00
std::mt19937 random_engine;
std::uniform_int_distribution<int> distribution;
2022-07-09 21:50:57 +00:00
};
2022-07-09 18:42:01 +00:00
class SoftwareCodecDeflateQpl
{
public:
2022-07-09 18:42:01 +00:00
~SoftwareCodecDeflateQpl();
uint32_t doCompressData(const char * source, uint32_t source_size, char * dest, uint32_t dest_size);
void doDecompressData(const char * source, uint32_t source_size, char * dest, uint32_t uncompressed_size);
private:
2022-07-09 14:09:23 +00:00
qpl_job * sw_job = nullptr;
qpl_job * getJobCodecPtr();
};
2022-07-09 18:42:01 +00:00
class HardwareCodecDeflateQpl
{
public:
2022-07-09 15:12:41 +00:00
/// RET_ERROR stands for hardware codec fail,need fallback to software codec.
static constexpr int32_t RET_ERROR = -1;
2022-07-09 18:42:01 +00:00
HardwareCodecDeflateQpl();
~HardwareCodecDeflateQpl();
2022-07-09 15:12:41 +00:00
int32_t doCompressData(const char * source, uint32_t source_size, char * dest, uint32_t dest_size) const;
int32_t doDecompressData(const char * source, uint32_t source_size, char * dest, uint32_t uncompressed_size) const;
int32_t doDecompressDataReq(const char * source, uint32_t source_size, char * dest, uint32_t uncompressed_size);
2022-07-09 17:54:23 +00:00
/// Flush result for previous asynchronous decompression requests.Must be used following with several calls of doDecompressDataReq.
void flushAsynchronousDecompressRequests();
private:
2022-07-09 14:09:23 +00:00
/// Asynchronous job map for decompression: job ID - job object.
/// For each submission, push job ID && job object into this map;
/// For flush, pop out job ID && job object from this map. Use job ID to release job lock and use job object to check job status till complete.
2022-07-08 16:20:24 +00:00
std::map<uint32_t, qpl_job *> decomp_async_job_map;
Poco::Logger * log;
};
2022-07-09 18:42:01 +00:00
class CompressionCodecDeflateQpl : public ICompressionCodec
{
public:
2022-07-09 18:42:01 +00:00
CompressionCodecDeflateQpl();
uint8_t getMethodByte() const override;
void updateHash(SipHash & hash) const override;
protected:
bool isCompression() const override
{
return true;
}
bool isGenericCompression() const override
{
return true;
}
uint32_t doCompressData(const char * source, uint32_t source_size, char * dest) const override;
void doDecompressData(const char * source, uint32_t source_size, char * dest, uint32_t uncompressed_size) const override;
2022-07-09 17:54:23 +00:00
///Flush result for previous asynchronous decompression requests on asynchronous mode.
void flushAsynchronousDecompressRequests() override;
private:
uint32_t getMaxCompressedDataSize(uint32_t uncompressed_size) const override;
2022-07-09 18:42:01 +00:00
std::unique_ptr<HardwareCodecDeflateQpl> hw_codec;
std::unique_ptr<SoftwareCodecDeflateQpl> sw_codec;
};
}