From d7c17d72d56247a04bcf8c58ca4586282d1e234b Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Tue, 3 May 2016 11:02:33 +0100 Subject: [PATCH] Use device index from CLI in OpenCL --- src/OCLStream.cpp | 40 ++++++++++++++++++++++++++-------------- src/OCLStream.h | 3 ++- src/main.cpp | 5 ++--- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/OCLStream.cpp b/src/OCLStream.cpp index 34b7933..422b409 100644 --- a/src/OCLStream.cpp +++ b/src/OCLStream.cpp @@ -1,6 +1,11 @@ #include "OCLStream.h" +// Cache list of devices +bool cached = false; +std::vector devices; +void getDeviceList(void); + std::string kernels{R"CLC( constant TYPE scalar = 3.0; @@ -43,16 +48,27 @@ std::string kernels{R"CLC( template -OCLStream::OCLStream(const unsigned int ARRAY_SIZE) +OCLStream::OCLStream(const unsigned int ARRAY_SIZE, const int device_index) { + if (!cached) + getDeviceList(); + array_size = ARRAY_SIZE; // Setup default OpenCL GPU - context = cl::Context::getDefault(); - queue = cl::CommandQueue::getDefault(); + if (device_index >= devices.size()) + throw std::runtime_error("Invalid device index"); + device = devices[device_index]; + + // Print out device information + std::cout << "Using OpenCL device " << getDeviceName(device_index) << std::endl; + std::cout << "Driver: " << getDeviceDriver(device_index) << std::endl; + + context = cl::Context(device); + queue = cl::CommandQueue(context); // Create program - cl::Program program(kernels); + cl::Program program(context, kernels); if (sizeof(T) == sizeof(double)) program.build("-DTYPE=double"); else if (sizeof(T) == sizeof(float)) @@ -123,23 +139,19 @@ void OCLStream::triad() template void OCLStream::write_arrays(const std::vector& a, const std::vector& b, const std::vector& c) { - cl::copy(a.begin(), a.end(), d_a); - cl::copy(b.begin(), b.end(), d_b); - cl::copy(c.begin(), c.end(), d_c); + cl::copy(queue, a.begin(), a.end(), d_a); + cl::copy(queue, b.begin(), b.end(), d_b); + cl::copy(queue, c.begin(), c.end(), d_c); } template void OCLStream::read_arrays(std::vector& a, std::vector& b, std::vector& c) { - cl::copy(d_a, a.begin(), a.end()); - cl::copy(d_b, b.begin(), b.end()); - cl::copy(d_c, c.begin(), c.end()); + cl::copy(queue, d_a, a.begin(), a.end()); + cl::copy(queue, d_b, b.begin(), b.end()); + cl::copy(queue, d_c, c.begin(), c.end()); } -// Cache list of devices -bool cached = false; -std::vector devices; - void getDeviceList(void) { // Get list of platforms diff --git a/src/OCLStream.h b/src/OCLStream.h index 551cf28..3fd144a 100644 --- a/src/OCLStream.h +++ b/src/OCLStream.h @@ -27,6 +27,7 @@ class OCLStream : public Stream cl::Buffer d_c; // OpenCL objects + cl::Device device; cl::Context context; cl::CommandQueue queue; @@ -37,7 +38,7 @@ class OCLStream : public Stream public: - OCLStream(const unsigned int); + OCLStream(const unsigned int, const int); ~OCLStream(); virtual void copy() override; diff --git a/src/main.cpp b/src/main.cpp index 7ec7873..1171180 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -61,11 +61,11 @@ void run() #if defined(CUDA) // Use the CUDA implementation - stream = new CUDAStream(ARRAY_SIZE); + stream = new CUDAStream(ARRAY_SIZE, deviceIndex); #elif defined(OCL) // Use the OpenCL implementation - stream = new OCLStream(ARRAY_SIZE); + stream = new OCLStream(ARRAY_SIZE, deviceIndex); #endif @@ -144,7 +144,6 @@ void run() << std::left << std::setw(12) << std::setprecision(5) << *minmax.second << std::left << std::setw(12) << std::setprecision(5) << average << std::endl; - }