From 6d3e1212f03bcd819dca0fe5a75330b92f11b81f Mon Sep 17 00:00:00 2001 From: Cedric Nugteren Date: Sat, 7 Oct 2017 18:43:29 +0200 Subject: Synchronizes clpp11.h with CLCudaAPI 9.0 --- src/clblast.cpp | 2 +- src/clpp11.hpp | 51 ++++++++++++++++++------------------ src/routine.cpp | 4 +-- src/utilities/clblast_exceptions.cpp | 2 +- test/diagnostics.cpp | 2 +- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/clblast.cpp b/src/clblast.cpp index 19d7ef0a..9f865a23 100644 --- a/src/clblast.cpp +++ b/src/clblast.cpp @@ -2492,7 +2492,7 @@ StatusCode OverrideParameters(const cl_device_id device, const std::string &kern // Retrieves the device name const auto device_cpp = Device(device); - const auto platform_id = device_cpp.Platform(); + const auto platform_id = device_cpp.PlatformID(); const auto device_name = GetDeviceName(device_cpp); // Retrieves the current database values to verify whether the new ones are complete diff --git a/src/clpp11.hpp b/src/clpp11.hpp index 7d348e18..b9b7fd5b 100644 --- a/src/clpp11.hpp +++ b/src/clpp11.hpp @@ -59,23 +59,22 @@ namespace clblast { // ================================================================================================= // Represents a runtime error returned by an OpenCL API function -class CLError : public ErrorCode { +class CLCudaAPIError : public ErrorCode { public: - explicit CLError(cl_int status, const std::string &where): - ErrorCode(status, - where, - "OpenCL error: " + where + ": " + std::to_string(static_cast(status))) { + explicit CLCudaAPIError(cl_int status, const std::string &where): + ErrorCode(status, where, "OpenCL error: " + where + ": " + + std::to_string(static_cast(status))) { } static void Check(const cl_int status, const std::string &where) { if (status != CL_SUCCESS) { - throw CLError(status, where); + throw CLCudaAPIError(status, where); } } static void CheckDtor(const cl_int status, const std::string &where) { if (status != CL_SUCCESS) { - fprintf(stderr, "CLBlast: %s (ignoring)\n", CLError(status, where).what()); + fprintf(stderr, "CLBlast: %s (ignoring)\n", CLCudaAPIError(status, where).what()); } } }; @@ -83,10 +82,10 @@ class CLError : public ErrorCode { // ================================================================================================= // Error occurred in OpenCL -#define CheckError(call) CLError::Check(call, CLError::TrimCallString(#call)) +#define CheckError(call) CLCudaAPIError::Check(call, CLCudaAPIError::TrimCallString(#call)) -// Error occured in OpenCL (no-exception version for destructors) -#define CheckErrorDtor(call) CLError::CheckDtor(call, CLError::TrimCallString(#call)) +// Error occurred in OpenCL (no-exception version for destructors) +#define CheckErrorDtor(call) CLCudaAPIError::CheckDtor(call, CLCudaAPIError::TrimCallString(#call)) // ================================================================================================= @@ -142,6 +141,9 @@ using EventPointer = cl_event*; // ================================================================================================= +// Raw platform ID type +using RawPlatformID = cl_platform_id; + // C++11 version of 'cl_platform_id' class Platform { public: @@ -230,7 +232,7 @@ class Device { } // Methods to retrieve device information - cl_platform_id Platform() const { return GetInfo(CL_DEVICE_PLATFORM); } + RawPlatformID PlatformID() const { return GetInfo(CL_DEVICE_PLATFORM); } std::string Version() const { return GetInfoString(CL_DEVICE_VERSION); } size_t VersionNumber() const { @@ -262,6 +264,7 @@ class Device { unsigned long LocalMemSize() const { return static_cast(GetInfo(CL_DEVICE_LOCAL_MEM_SIZE)); } + std::string Capabilities() const { return GetInfoString(CL_DEVICE_EXTENSIONS); } bool HasExtension(const std::string &extension) const { const auto extensions = Capabilities(); @@ -330,7 +333,6 @@ class Device { std::string{"."} + std::to_string(GetInfo(CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV)); } - // Accessor to the private data-member const cl_device_id& operator()() const { return device_; } private: @@ -385,7 +387,7 @@ class Context { auto status = CL_SUCCESS; const cl_device_id dev = device(); *context_ = clCreateContext(nullptr, 1, &dev, nullptr, nullptr, &status); - CLError::Check(status, "clCreateContext"); + CLCudaAPIError::Check(status, "clCreateContext"); } // Accessor to the private data-member @@ -400,9 +402,6 @@ using ContextPointer = cl_context*; // ================================================================================================= -// Enumeration of build statuses of the run-time compilation process -enum class BuildStatus { kSuccess, kError, kInvalid }; - // C++11 version of 'cl_program'. class Program { public: @@ -415,10 +414,10 @@ class Program { delete p; }) { const char *source_ptr = &source[0]; - size_t length = source.length(); + const auto length = source.length(); auto status = CL_SUCCESS; *program_ = clCreateProgramWithSource(context(), 1, &source_ptr, &length, &status); - CLError::Check(status, "clCreateProgramWithSource"); + CLCudaAPIError::Check(status, "clCreateProgramWithSource"); } // Binary-based constructor with memory management @@ -428,18 +427,18 @@ class Program { delete p; }) { const char *binary_ptr = &binary[0]; - size_t length = binary.length(); + const auto length = binary.length(); auto status1 = CL_SUCCESS; auto status2 = CL_SUCCESS; - const cl_device_id dev = device(); + const auto dev = device(); *program_ = clCreateProgramWithBinary(context(), 1, &dev, &length, reinterpret_cast(&binary_ptr), &status1, &status2); - CLError::Check(status1, "clCreateProgramWithBinary (binary status)"); - CLError::Check(status2, "clCreateProgramWithBinary"); + CLCudaAPIError::Check(status1, "clCreateProgramWithBinary (binary status)"); + CLCudaAPIError::Check(status2, "clCreateProgramWithBinary"); } - // Compiles the device program and returns whether or not there where any warnings/errors + // Compiles the device program and checks whether or not there are any warnings/errors void Build(const Device &device, std::vector &options) { options.push_back("-cl-std=CL1.1"); auto options_string = std::accumulate(options.begin(), options.end(), std::string{" "}); @@ -495,7 +494,7 @@ class Queue { }) { auto status = CL_SUCCESS; *queue_ = clCreateCommandQueue(context(), device(), CL_QUEUE_PROFILING_ENABLE, &status); - CLError::Check(status, "clCreateCommandQueue"); + CLCudaAPIError::Check(status, "clCreateCommandQueue"); } // Synchronizes the queue @@ -587,7 +586,7 @@ class Buffer { if (access_ == BufferAccess::kWriteOnly) { flags = CL_MEM_WRITE_ONLY; } auto status = CL_SUCCESS; *buffer_ = clCreateBuffer(context(), flags, size*sizeof(T), nullptr, &status); - CLError::Check(status, "clCreateBuffer"); + CLCudaAPIError::Check(status, "clCreateBuffer"); } // As above, but now with read/write access as a default @@ -719,7 +718,7 @@ class Kernel { }) { auto status = CL_SUCCESS; *kernel_ = clCreateKernel(program(), name.c_str(), &status); - CLError::Check(status, "clCreateKernel"); + CLCudaAPIError::Check(status, "clCreateKernel"); } // Sets a kernel argument at the indicated position diff --git a/src/routine.cpp b/src/routine.cpp index b25eec56..0a1b6e30 100644 --- a/src/routine.cpp +++ b/src/routine.cpp @@ -60,7 +60,7 @@ Routine::Routine(Queue &queue, EventPointer event, const std::string &name, event_(event), context_(queue_.GetContext()), device_(queue_.GetDevice()), - platform_(device_.Platform()), + platform_(device_.PlatformID()), db_(kernel_names) { InitDatabase(userDatabase); @@ -188,7 +188,7 @@ void Routine::InitProgram(std::initializer_list source) { program_ = Program(context_, source_string); try { program_.Build(device_, options); - } catch (const CLError &e) { + } catch (const CLCudaAPIError &e) { if (e.status() == CL_BUILD_PROGRAM_FAILURE) { fprintf(stdout, "OpenCL compiler error/warning: %s\n", program_.GetBuildInfo(device_).c_str()); diff --git a/src/utilities/clblast_exceptions.cpp b/src/utilities/clblast_exceptions.cpp index 96f10860..32526215 100644 --- a/src/utilities/clblast_exceptions.cpp +++ b/src/utilities/clblast_exceptions.cpp @@ -55,7 +55,7 @@ StatusCode DispatchException() } catch (BLASError &e) { // no message is printed for invalid argument errors status = e.status(); - } catch (CLError &e) { + } catch (CLCudaAPIError &e) { message = e.what(); status = static_cast(e.status()); } catch (RuntimeErrorCode &e) { diff --git a/test/diagnostics.cpp b/test/diagnostics.cpp index 99b936f8..af56cd30 100644 --- a/test/diagnostics.cpp +++ b/test/diagnostics.cpp @@ -85,7 +85,7 @@ void OpenCLDiagnostics(int argc, char *argv[]) { printf("* device.Name() %.4lf ms\n", TimeFunction(kNumRuns, [&](){device.Name();} )); printf("* device.Vendor() %.4lf ms\n", TimeFunction(kNumRuns, [&](){device.Vendor();} )); printf("* device.Version() %.4lf ms\n", TimeFunction(kNumRuns, [&](){device.Version();} )); - printf("* device.Platform() %.4lf ms\n", TimeFunction(kNumRuns, [&](){device.Platform();} )); + printf("* device.Platform() %.4lf ms\n", TimeFunction(kNumRuns, [&](){ device.PlatformID();} )); printf("* Buffer(context, 1024) %.4lf ms\n", TimeFunction(kNumRuns, [&](){Buffer(context, 1024);} )); printf("\n"); -- cgit v1.2.3