summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clpp11.hpp27
1 files changed, 23 insertions, 4 deletions
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<size_t> 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<char*> out(num_devices, nullptr);
+ out[binSizeIter] = const_cast<char*>(result.data());
+
+ CheckError(clGetProgramInfo(program_, CL_PROGRAM_BINARIES,
+ num_devices * sizeof(char*),
+ out.data(), nullptr));
return result;
}