Skip to content

Instantly share code, notes, and snippets.

@jirihnidek
Last active November 2, 2021 17:15
Show Gist options
  • Save jirihnidek/3f23b7451c1744d71dbf to your computer and use it in GitHub Desktop.
Save jirihnidek/3f23b7451c1744d71dbf to your computer and use it in GitHub Desktop.
C++ OpenCL Example
# Minimal version of CMake
cmake_minimum_required (VERSION 2.6)
# Build type
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Debug' as none was specified.")
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")
endif ()
# Define project name
project (OpenCL_Example)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/")
find_package( OpenCL REQUIRED )
include_directories( ${OPENCL_INCLUDE_DIR} )
# Source code of application
set (opencl_example_src opencl_example.cc)
# Compiler flags
if (CMAKE_COMPILER_IS_GNUCC)
set (CMAKE_CXX_FLAGS "-D_REETRANT -Wall -Wextra -pedantic -Wno-long-long")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -O0")
elseif( CMAKE_BUILD_TYPE STREQUAL "Release" )
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -fno-strict-aliasing")
endif ()
endif (CMAKE_COMPILER_IS_GNUCC)
# Set up executable
add_executable (opencl_example ${opencl_example_src})
target_link_libraries(opencl_example ${OPENCL_LIBRARIES})
# - Try to find OpenCL
# Once done this will define
#
# OPENCL_FOUND - system has OpenCL
# OPENCL_INCLUDE_DIR - the OpenCL include directory
# OPENCL_LIBRARIES - link these to use OpenCL
#
# WIN32 should work, but is untested
IF (WIN32)
FIND_PATH(OPENCL_INCLUDE_DIR CL/cl.h )
# TODO this is only a hack assuming the 64 bit library will
# not be found on 32 bit system
FIND_LIBRARY(OPENCL_LIBRARIES opencl64 )
IF( OPENCL_LIBRARIES )
FIND_LIBRARY(OPENCL_LIBRARIES opencl32 )
ENDIF( OPENCL_LIBRARIES )
ELSE (WIN32)
# Unix style platforms
# We also search for OpenCL in the NVIDIA SDK default location
FIND_PATH(OPENCL_INCLUDE_DIR CL/cl.h /opt/AMDAPPSDK-2.9-1/include/ )
FIND_LIBRARY(OPENCL_LIBRARIES OpenCL
ENV LD_LIBRARY_PATH
)
ENDIF (WIN32)
SET( OPENCL_FOUND "NO" )
IF(OPENCL_LIBRARIES )
SET( OPENCL_FOUND "YES" )
ENDIF(OPENCL_LIBRARIES)
MARK_AS_ADVANCED(
OPENCL_INCLUDE_DIR
)
#define __CL_ENABLE_EXCEPTIONS
#if defined(__APPLE__) || defined(__MACOSX)
#include <OpenCL/cl.hpp>
#else
#include <CL/cl.hpp>
#endif
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <vector>
const char * helloStr = "__kernel void "
"hello(void) "
"{ "
" "
"} ";
int main(void)
{
cl_int err = CL_SUCCESS;
try {
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
if (platforms.size() == 0) {
std::cout << "Platform size 0\n";
return -1;
}
// Print number of platforms and list of platforms
std::cout << "Platform number is: " << platforms.size() << std::endl;
std::string platformVendor;
for (unsigned int i = 0; i < platforms.size(); ++i) {
platforms[i].getInfo((cl_platform_info)CL_PLATFORM_VENDOR, &platformVendor);
std::cout << "Platform is by: " << platformVendor << std::endl;
}
cl_context_properties properties[] =
{
CL_CONTEXT_PLATFORM,
(cl_context_properties)(platforms[0])(),
0
};
cl::Context context(CL_DEVICE_TYPE_ALL, properties);
std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
// Print number of devices and list of devices
std::cout << "Device number is: " << devices.size() << std::endl;
for (unsigned int i = 0; i < devices.size(); ++i) {
std::cout << "Device #" << i << ": " << devices[i].getInfo<CL_DEVICE_NAME>() << std::endl;
}
cl::Program::Sources source(1,
std::make_pair(helloStr, strlen(helloStr)));
cl::Program program_ = cl::Program(context, source);
program_.build(devices);
cl::Kernel kernel(program_, "hello", &err);
cl::Event event;
cl::CommandQueue queue(context, devices[0], 0, &err);
queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(4,4),
cl::NullRange,
NULL,
&event);
event.wait();
}
catch (cl::Error err) {
std::cerr
<< "ERROR: "
<< err.what()
<< "("
<< err.err()
<< ")"
<< std::endl;
}
return EXIT_SUCCESS;
}
@jirihnidek
Copy link
Author

Note: This code was tested only with AMD GPU at Linux.

Copy link

ghost commented Aug 27, 2017

Works with Intel GT2 on Ubuntu 17.04 installing everything here: https://askubuntu.com/a/850594/698904
Output:

Platform number is: 1
Platform is by: Intel
Device number is: 1
Device #0: Intel(R) HD Graphics Kabylake ULT GT2

@devillove084
Copy link

works with arch installing everything
Output :
Platform number is: 3 Platform is by: Intel(R) Corporation Platform is by: NVIDIA Corporation Platform is by: Mesa Device number is: 1 Device #0: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz

@psi19ceee5
Copy link

Works also on Nvidia GTX 1080 on Ubuntu 18.04. (OpenCL libs distributed with the Cuda 8.0 toolkit)
Output:
Platform number is: 1
Platform is by: NVIDIA Corporation
Device number is: 1
Device #0: GeForce GTX 1080

@ZaydH
Copy link

ZaydH commented Nov 11, 2020

Works on PopOS 20.04 with Nvidia GTX 2070

The key to make my OpenCL program work was to add set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/") to my CMakeList.txt file. Then my program would work with the custom FindOpenCL.cmake file.

@hailsham
Copy link

works on Ubuntu14.04, nvidia GTX 1060. minor changes by setting cuda/include as OPENCL_INCLUDE_DIR and cuda/lib64/libOpenCL.so as OPENCL_LIBRARIES. output:

Platform number is: 1
Platform is by: NVIDIA Corporation
Device number is: 1
Device #0: GeForce GTX 1060 6GB

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment