// Copyright (c) 2015-16 Tom Deakin, Simon McIntosh-Smith, // University of Bristol HPC // // For full license terms please see the LICENSE file distributed with this // source code #pragma once #include #include #define CL_HPP_ENABLE_EXCEPTIONS #define CL_HPP_TARGET_OPENCL_VERSION 120 #define CL_HPP_MINIMUM_OPENCL_VERSION 120 #include "CL/cl2.hpp" #include "Stream.h" #define IMPLEMENTATION_STRING "OpenCL" // Local work-group size for dot kernel #define WGSIZE 1024 template class OCLStream : public Stream { protected: // Size of arrays unsigned int array_size; // Host array for partial sums for dot kernel std::vector sums; // Device side pointers to arrays cl::Buffer d_a; cl::Buffer d_b; cl::Buffer d_c; cl::Buffer d_sum; // OpenCL objects cl::Device device; cl::Context context; cl::CommandQueue queue; cl::KernelFunctor *copy_kernel; cl::KernelFunctor * mul_kernel; cl::KernelFunctor *add_kernel; cl::KernelFunctor *triad_kernel; cl::KernelFunctor *dot_kernel; public: OCLStream(const unsigned int, const int); ~OCLStream(); virtual void copy() override; virtual void add() override; virtual void mul() override; virtual void triad() override; virtual T dot() override; virtual void write_arrays(const std::vector& a, const std::vector& b, const std::vector& c) override; virtual void read_arrays(std::vector& a, std::vector& b, std::vector& c) override; }; // Populate the devices list void getDeviceList(void);