diff options
author | Cedric Nugteren <web@cedricnugteren.nl> | 2016-05-26 23:36:19 +0200 |
---|---|---|
committer | Cedric Nugteren <web@cedricnugteren.nl> | 2016-05-26 23:36:19 +0200 |
commit | 03182f9d07533f795a498936391da744d982e8e2 (patch) | |
tree | 3a73046809927abd1000fe3309f37787d1791976 /src | |
parent | b487d4dd44179293c9e08ddf2ce3ed902fa749c8 (diff) |
Added half-precision tests for the clBLAS reference through conversion to single-precision
Diffstat (limited to 'src')
-rw-r--r-- | src/utilities.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/utilities.cc b/src/utilities.cc index 1a7c8e45..7649b05c 100644 --- a/src/utilities.cc +++ b/src/utilities.cc @@ -299,6 +299,41 @@ void PopulateVector(std::vector<half> &vector) { // ================================================================================================= +// Conversion between half and single-precision +std::vector<float> HalfToFloatBuffer(const std::vector<half>& source) { + auto result = std::vector<float>(source.size()); + for (auto i = size_t(0); i < source.size(); ++i) { result[i] = HalfToFloat(source[i]); } + return result; +} +void FloatToHalfBuffer(std::vector<half>& result, const std::vector<float>& source) { + for (auto i = size_t(0); i < source.size(); ++i) { result[i] = FloatToHalf(source[i]); } +} + +// As above, but now for OpenCL data-types instead of std::vectors +Buffer<float> HalfToFloatBuffer(const Buffer<half>& source, cl_command_queue queue_raw) { + const auto size = source.GetSize() / sizeof(half); + auto queue = Queue(queue_raw); + auto context = queue.GetContext(); + auto source_cpu = std::vector<half>(size); + source.Read(queue, size, source_cpu); + auto result_cpu = HalfToFloatBuffer(source_cpu); + auto result = Buffer<float>(context, size); + result.Write(queue, size, result_cpu); + return result; +} +void FloatToHalfBuffer(Buffer<half>& result, const Buffer<float>& source, cl_command_queue queue_raw) { + const auto size = source.GetSize() / sizeof(float); + auto queue = Queue(queue_raw); + auto context = queue.GetContext(); + auto source_cpu = std::vector<float>(size); + source.Read(queue, size, source_cpu); + auto result_cpu = std::vector<half>(size); + FloatToHalfBuffer(result_cpu, source_cpu); + result.Write(queue, size, result_cpu); +} + +// ================================================================================================= + // Rounding functions performing ceiling and division operations size_t CeilDiv(const size_t x, const size_t y) { return 1 + ((x - 1) / y); |