diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/clpp11.hpp | 1 | ||||
-rw-r--r-- | src/database/database.cpp | 42 | ||||
-rw-r--r-- | src/database/database.hpp | 1 | ||||
-rw-r--r-- | src/database/database_structure.hpp | 18 | ||||
-rw-r--r-- | src/tuning/tuning.hpp | 16 | ||||
-rw-r--r-- | src/utilities/device_mapping.hpp (renamed from src/database/device_mapping.hpp) | 12 | ||||
-rw-r--r-- | src/utilities/utilities.cpp | 54 | ||||
-rw-r--r-- | src/utilities/utilities.hpp | 8 |
8 files changed, 102 insertions, 50 deletions
diff --git a/src/clpp11.hpp b/src/clpp11.hpp index 9d6929a7..86a84815 100644 --- a/src/clpp11.hpp +++ b/src/clpp11.hpp @@ -167,6 +167,7 @@ class Platform { // Methods to retrieve platform information std::string Name() const { return GetInfoString(CL_PLATFORM_NAME); } std::string Vendor() const { return GetInfoString(CL_PLATFORM_VENDOR); } + std::string Version() const { return GetInfoString(CL_PLATFORM_VERSION); } // Returns the number of devices on this platform size_t NumDevices() const { diff --git a/src/database/database.cpp b/src/database/database.cpp index d2add8c9..2d78e65c 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -16,6 +16,7 @@ #include "utilities/utilities.hpp" #include "database/database.hpp" + #include "database/kernels/xaxpy/xaxpy.hpp" #include "database/kernels/xdot/xdot.hpp" #include "database/kernels/xgemv/xgemv.hpp" @@ -28,6 +29,7 @@ #include "database/kernels/pad/pad.hpp" #include "database/kernels/transpose/transpose.hpp" #include "database/kernels/padtranspose/padtranspose.hpp" + #include "database/kernels/xtrsv.hpp" #include "database/kernels/invert.hpp" #include "database/apple_cpu_fallback.hpp" @@ -77,37 +79,17 @@ Database::Database(const Device &device, const std::string &kernel_name, const Precision precision, const std::vector<database::DatabaseEntry> &overlay): parameters_(std::make_shared<database::Parameters>()) { - // Finds top-level information (vendor and type) - auto device_type = device.Type(); - auto device_vendor = device.Vendor(); - for (auto &find_and_replace : database::kVendorNames) { // replacing to common names - if (device_vendor == find_and_replace.first) { device_vendor = find_and_replace.second; } - } + // Finds device information + const auto device_type = GetDeviceType(device); + const auto device_vendor = GetDeviceVendor(device); + const auto device_architecture = GetDeviceArchitecture(device); + const auto device_name = GetDeviceName(device); - // Finds mid-level information (architecture) - auto device_architecture = std::string{""}; - if (device.HasExtension(kKhronosAttributesNVIDIA)) { - device_architecture = device.NVIDIAComputeCapability(); - } - else if (device.HasExtension(kKhronosAttributesAMD)) { - device_architecture = device.Name(); // Name is architecture for AMD APP and AMD ROCm - } - // Note: no else - 'device_architecture' might be the empty string - for (auto &find_and_replace : database::kArchitectureNames) { // replacing to common names - if (device_architecture == find_and_replace.first) { device_architecture = find_and_replace.second; } - } - - // Finds low-level information (device name) - auto device_name = std::string{""}; - if (device.HasExtension(kKhronosAttributesAMD)) { - device_name = device.AMDBoardName(); - } - else { - device_name = device.Name(); - } - for (auto &find_and_replace : database::kDeviceNames) { // replacing to common names - if (device_name == find_and_replace.first) { device_name = find_and_replace.second; } - } + // Prints the obtained information in verbose mode + #ifdef VERBOSE + printf("[DEBUG] Device type '%s'; vendor '%s'\n", device_type.c_str(), device_vendor.c_str()); + printf("[DEBUG] Device name '%s'; architecture '%s'\n", device_name.c_str(), device_architecture.c_str()); + #endif // Sets the databases to search through const auto databases = std::list<std::vector<database::DatabaseEntry>>{overlay, database}; diff --git a/src/database/database.hpp b/src/database/database.hpp index e7a79cf9..7efcb7c4 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -23,7 +23,6 @@ #include "utilities/utilities.hpp" #include "database/database_structure.hpp" -#include "database/device_mapping.hpp" namespace clblast { // ================================================================================================= diff --git a/src/database/database_structure.hpp b/src/database/database_structure.hpp index 4d7f967d..d9ee95fb 100644 --- a/src/database/database_structure.hpp +++ b/src/database/database_structure.hpp @@ -35,19 +35,19 @@ using Parameters = std::unordered_map<std::string, size_t>; // Structures for content inside the database struct DatabaseDevice { - std::string name; - std::vector<size_t> parameters; // parameter values + const std::string name; + const std::vector<size_t> parameters; // parameter values }; struct DatabaseVendor { - std::string type; - std::string name; - std::vector<DatabaseDevice> devices; + const std::string type; + const std::string name; + const std::vector<DatabaseDevice> devices; }; struct DatabaseEntry { - std::string kernel; - Precision precision; - std::vector<std::string> parameter_names; - std::vector<DatabaseVendor> vendors; + const std::string kernel; + const Precision precision; + const std::vector<std::string> parameter_names; + const std::vector<DatabaseVendor> vendors; }; // ================================================================================================= diff --git a/src/tuning/tuning.hpp b/src/tuning/tuning.hpp index 9bb5836e..1f9b6f4f 100644 --- a/src/tuning/tuning.hpp +++ b/src/tuning/tuning.hpp @@ -66,7 +66,11 @@ void Tuner(int argc, char* argv[]) { auto isAMD = false; auto isARM = false; auto isGPU = false; - { + auto device_type = std::string{}; + auto device_vendor = std::string{}; + auto device_architecture = std::string{}; + auto device_name = std::string{}; + { // In a block such that the platform and the device are destroyed before initializing the tuner const auto platform = Platform(args.platform_id); const auto device = Device(platform, args.device_id); if (!PrecisionSupported<T>(device)) { @@ -76,6 +80,10 @@ void Tuner(int argc, char* argv[]) { isAMD = device.IsAMD(); isARM = device.IsARM(); isGPU = device.IsGPU(); + device_type = GetDeviceType(device); + device_vendor = GetDeviceVendor(device); + device_architecture = GetDeviceArchitecture(device); + device_name = GetDeviceName(device); } // Creates input buffers with random data @@ -159,7 +167,11 @@ void Tuner(int argc, char* argv[]) { auto precision_string = std::to_string(static_cast<size_t>(args.precision)); auto metadata = std::vector<std::pair<std::string,std::string>>{ {"kernel_family", C::KernelFamily()}, - {"precision", precision_string} + {"precision", precision_string}, + {"clblast_device_type", device_type}, + {"clblast_device_vendor", device_vendor}, + {"clblast_device_architecture", device_architecture}, + {"clblast_device_name", device_name} }; for (auto &o: C::GetOptions()) { if (o == kArgM) { metadata.push_back({"arg_m", std::to_string(args.m)}); } diff --git a/src/database/device_mapping.hpp b/src/utilities/device_mapping.hpp index 9fb5d81d..7fdc04a0 100644 --- a/src/database/device_mapping.hpp +++ b/src/utilities/device_mapping.hpp @@ -12,15 +12,15 @@ // // ================================================================================================= -#ifndef CLBLAST_DATABASE_DEVICE_MAPPING_H_ -#define CLBLAST_DATABASE_DEVICE_MAPPING_H_ +#ifndef CLBLAST_UTILITIES_DEVICE_MAPPING_H_ +#define CLBLAST_UTILITIES_DEVICE_MAPPING_H_ #include <string> #include <unordered_map> namespace clblast { -// A special namespace to hold all the global constant variables (including the device mapping) -namespace database { +// A special namespace to hold all the global constant variables +namespace device_mapping { // ================================================================================================= @@ -44,8 +44,8 @@ const std::unordered_map<std::string, std::string> kDeviceNames { }; // ================================================================================================= -} // namespace database +} // namespace device_mapping } // namespace clblast -// CLBLAST_DATABASE_DEVICE_MAPPING_H_ +// CLBLAST_UTILITIES_DEVICE_MAPPING_H_ #endif diff --git a/src/utilities/utilities.cpp b/src/utilities/utilities.cpp index 4ff419a5..4b8d5a09 100644 --- a/src/utilities/utilities.cpp +++ b/src/utilities/utilities.cpp @@ -11,8 +11,6 @@ // // ================================================================================================= -#include "utilities/utilities.hpp" - #include <string> #include <vector> #include <chrono> @@ -20,6 +18,10 @@ #include <iomanip> #include <cmath> +#include "utilities/utilities.hpp" + +#include "utilities/device_mapping.hpp" + namespace clblast { // ================================================================================================= @@ -401,4 +403,52 @@ template <> bool PrecisionSupported<half>(const Device &device) { } // ================================================================================================= + +// High-level info +std::string GetDeviceType(const Device& device) { + return device.Type(); +} +std::string GetDeviceVendor(const Device& device) { + auto device_vendor = device.Vendor(); + + for (auto &find_and_replace : device_mapping::kVendorNames) { // replacing to common names + if (device_vendor == find_and_replace.first) { device_vendor = find_and_replace.second; } + } + return device_vendor; +} + +// Mid-level info +std::string GetDeviceArchitecture(const Device& device) { + auto device_architecture = std::string{""}; + if (device.HasExtension(kKhronosAttributesNVIDIA)) { + device_architecture = device.NVIDIAComputeCapability(); + } + else if (device.HasExtension(kKhronosAttributesAMD)) { + device_architecture = device.Name(); // Name is architecture for AMD APP and AMD ROCm + } + // Note: no else - 'device_architecture' might be the empty string + + for (auto &find_and_replace : device_mapping::kArchitectureNames) { // replacing to common names + if (device_architecture == find_and_replace.first) { device_architecture = find_and_replace.second; } + } + return device_architecture; +} + +// Lowest-level +std::string GetDeviceName(const Device& device) { + auto device_name = std::string{""}; + if (device.HasExtension(kKhronosAttributesAMD)) { + device_name = device.AMDBoardName(); + } + else { + device_name = device.Name(); + } + + for (auto &find_and_replace : device_mapping::kDeviceNames) { // replacing to common names + if (device_name == find_and_replace.first) { device_name = find_and_replace.second; } + } + return device_name; +} + +// ================================================================================================= } // namespace clblast diff --git a/src/utilities/utilities.hpp b/src/utilities/utilities.hpp index 3ffb3be5..d912a377 100644 --- a/src/utilities/utilities.hpp +++ b/src/utilities/utilities.hpp @@ -308,6 +308,14 @@ template <typename T> bool PrecisionSupported(const Device &device); // ================================================================================================= + +// Device information in a specific CLBlast form +std::string GetDeviceType(const Device& device); +std::string GetDeviceVendor(const Device& device); +std::string GetDeviceArchitecture(const Device& device); +std::string GetDeviceName(const Device& device); + +// ================================================================================================= } // namespace clblast // CLBLAST_UTILITIES_H_ |