Routine: cache the database instance as well

This does not change much, but will become useful in next commits when
plugin support is introduced.
pull/132/head
Ivan Shapovalov 2016-11-28 04:23:01 +03:00
parent 6dc18c1c57
commit 50e758a007
4 changed files with 54 additions and 3 deletions

View File

@ -15,6 +15,7 @@
#include <vector>
#include <mutex>
#include "database/database.hpp"
#include "cache.hpp"
namespace clblast {
@ -88,5 +89,10 @@ template std::string BinaryCache::Get(const BinaryKeyRef &, bool *) const;
template class Cache<ProgramKey, Program>;
template Program ProgramCache::Get(const ProgramKeyRef &, bool *) const;
// =================================================================================================
template class Cache<DatabaseKey, Database>;
template Database DatabaseCache::Get(const DatabaseKeyRef &, bool *) const;
// =================================================================================================
} // namespace clblast

View File

@ -85,6 +85,20 @@ typedef Cache<ProgramKey, Program> ProgramCache;
extern template class Cache<ProgramKey, Program>;
extern template Program ProgramCache::Get(const ProgramKeyRef &, bool *) const;
// =================================================================================================
class Database;
// The key struct for the cache of database maps.
// Order of fields: precision, device_name, routines (smaller fields first)
typedef std::tuple<Precision, std::string, std::vector<std::string>> DatabaseKey;
typedef std::tuple<const Precision &, const std::string &, const std::vector<std::string> &> DatabaseKeyRef;
typedef Cache<DatabaseKey, Database> DatabaseCache;
extern template class Cache<DatabaseKey, Database>;
extern template Database DatabaseCache::Get(const DatabaseKeyRef &, bool *) const;
// =================================================================================================
} // namespace clblast

View File

@ -32,8 +32,28 @@ Routine::Routine(Queue &queue, EventPointer event, const std::string &name,
event_(event),
context_(queue_.GetContext()),
device_(queue_.GetDevice()),
device_name_(device_.Name()),
db_(queue_, routines, precision_, userDatabase) {
device_name_(device_.Name()) {
InitDatabase(routines, userDatabase);
InitProgram(source);
}
void Routine::InitDatabase(const std::vector<std::string> &routines,
const std::vector<const Database::DatabaseEntry*> &userDatabase) {
// Queries the cache to see whether or not the kernel parameter database is already there
bool has_db;
db_ = DatabaseCache::Instance().Get(DatabaseKeyRef{ precision_, device_name_, routines },
&has_db);
if (has_db) { return; }
// Builds the parameter database for this device and routine set and stores it in the cache
db_ = Database(queue_, routines, precision_, userDatabase);
DatabaseCache::Instance().Store(DatabaseKey{ precision_, device_name_, routines },
Database{ db_ });
}
void Routine::InitProgram(std::initializer_list<const char *> source) {
// Queries the cache to see whether or not the program (context-specific) is already there
bool has_program;

View File

@ -35,11 +35,22 @@ class Routine {
// Base class constructor. The user database is an optional extra database to override the
// built-in database.
// All heavy preparation work is done inside this constructor.
// NOTE: the caller must provide the same userDatabase for each combination of device, precision
// and routine list, otherwise the caching logic will break.
explicit Routine(Queue &queue, EventPointer event, const std::string &name,
const std::vector<std::string> &routines, const Precision precision,
const std::vector<const Database::DatabaseEntry*> &userDatabase,
std::initializer_list<const char *> source);
private:
// Initializes program_, fetching cached program or building one
void InitProgram(std::initializer_list<const char *> source);
// Initializes db_, fetching cached database or building one
void InitDatabase(const std::vector<std::string> &routines,
const std::vector<const Database::DatabaseEntry*> &userDatabase);
protected:
// Non-static variable for the precision
@ -61,7 +72,7 @@ class Routine {
Program program_;
// Connection to the database for all the device-specific parameters
const Database db_;
Database db_;
};
// =================================================================================================