From aec71699f8278df31b16fa544138f3bd60940c8c Mon Sep 17 00:00:00 2001 From: Pradeep Garigipati Date: Fri, 5 Jun 2020 12:00:45 +0530 Subject: Fix Program::GetIR to handle programs with multiple devices --- src/clpp11.hpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/clpp11.hpp b/src/clpp11.hpp index 4ed157ea..7465fd94 100644 --- a/src/clpp11.hpp +++ b/src/clpp11.hpp @@ -509,12 +509,31 @@ class Program { // Retrieves a binary or an intermediate representation of the compiled program std::string GetIR() const { - auto bytes = size_t{0}; - CheckError(clGetProgramInfo(program_, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &bytes, nullptr)); + cl_uint num_devices = 0; + CheckError(clGetProgramInfo(program_, CL_PROGRAM_NUM_DEVICES, + sizeof(cl_uint), &num_devices, nullptr)); + + std::vector binSizesInBytes(num_devices, 0); + CheckError(clGetProgramInfo(program_, CL_PROGRAM_BINARY_SIZES, + num_devices * sizeof(size_t), binSizesInBytes.data(), nullptr)); + + auto bytes = size_t{0}; + auto binSizeIter = size_t{0}; + for (; binSizeIter < binSizesInBytes.size(); ++binSizeIter) { + if (binSizesInBytes[binSizeIter] > 0) { + bytes = binSizesInBytes[binSizeIter]; + break; + } + } auto result = std::string{}; result.resize(bytes); - auto result_ptr = result.data(); - CheckError(clGetProgramInfo(program_, CL_PROGRAM_BINARIES, sizeof(char*), &result_ptr, nullptr)); + + std::vector out(num_devices, nullptr); + out[binSizeIter] = const_cast(result.data()); + + CheckError(clGetProgramInfo(program_, CL_PROGRAM_BINARIES, + num_devices * sizeof(char*), + out.data(), nullptr)); return result; } -- cgit v1.2.3