diff --git a/CMakeCommon/FindOpenCL.cmake b/CMakeCommon/FindOpenCL.cmake new file mode 100755 index 0000000..d6533f9 --- /dev/null +++ b/CMakeCommon/FindOpenCL.cmake @@ -0,0 +1,147 @@ +# Taken from CMake Version 3.2.1, modified to work on older versions +#.rst: +# FindOpenCL +# ---------- +# +# Try to find OpenCL +# +# Once done this will define:: +# +# OpenCL_FOUND - True if OpenCL was found +# OpenCL_INCLUDE_DIRS - include directories for OpenCL +# OpenCL_LIBRARIES - link against this library to use OpenCL +# OpenCL_VERSION_STRING - Highest supported OpenCL version (eg. 1.2) +# OpenCL_VERSION_MAJOR - The major version of the OpenCL implementation +# OpenCL_VERSION_MINOR - The minor version of the OpenCL implementation +# +# The module will also define two cache variables:: +# +# OpenCL_INCLUDE_DIR - the OpenCL include directory +# OpenCL_LIBRARY - the path to the OpenCL library +# + +#============================================================================= +# Copyright 2014 Matthaeus G. Chajdas +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +function(_FIND_OPENCL_VERSION) + include(CheckSymbolExists) + include(CMakePushCheckState) + set(CMAKE_REQUIRED_QUIET ${OpenCL_FIND_QUIETLY}) + + CMAKE_PUSH_CHECK_STATE() + foreach(VERSION "2_0" "1_2" "1_1" "1_0") + set(CMAKE_REQUIRED_INCLUDES "${OpenCL_INCLUDE_DIR}") + + if(APPLE) + CHECK_SYMBOL_EXISTS( + CL_VERSION_${VERSION} + "${OpenCL_INCLUDE_DIR}/OpenCL/cl.h" + OPENCL_VERSION_${VERSION}) + else() + CHECK_SYMBOL_EXISTS( + CL_VERSION_${VERSION} + "${OpenCL_INCLUDE_DIR}/CL/cl.h" + OPENCL_VERSION_${VERSION}) + endif() + + if(OPENCL_VERSION_${VERSION}) + string(REPLACE "_" "." VERSION "${VERSION}") + set(OpenCL_VERSION_STRING ${VERSION} PARENT_SCOPE) + string(REGEX MATCHALL "[0-9]+" version_components "${VERSION}") + list(GET version_components 0 major_version) + list(GET version_components 1 minor_version) + set(OpenCL_VERSION_MAJOR ${major_version} PARENT_SCOPE) + set(OpenCL_VERSION_MINOR ${minor_version} PARENT_SCOPE) + break() + endif() + endforeach() + CMAKE_POP_CHECK_STATE() +endfunction() + +find_path(OpenCL_INCLUDE_DIR + NAMES + CL/cl.h OpenCL/cl.h + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV NVSDKCOMPUTE_ROOT + ENV CUDA_PATH + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + include + OpenCL/common/inc + "AMD APP/include") + +_FIND_OPENCL_VERSION() + +if(WIN32) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + find_library(OpenCL_LIBRARY + NAMES OpenCL + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV CUDA_PATH + ENV NVSDKCOMPUTE_ROOT + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + "AMD APP/lib/x86" + lib/x86 + lib/Win32 + OpenCL/common/lib/Win32) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) + find_library(OpenCL_LIBRARY + NAMES OpenCL + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV CUDA_PATH + ENV NVSDKCOMPUTE_ROOT + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + "AMD APP/lib/x86_64" + lib/x86_64 + lib/x64 + OpenCL/common/lib/x64) + endif() +else() + find_library(OpenCL_LIBRARY + NAMES OpenCL) +endif() + +set(OpenCL_LIBRARIES ${OpenCL_LIBRARY}) +set(OpenCL_INCLUDE_DIRS ${OpenCL_INCLUDE_DIR}) + + +#find_package_handle_standard_args not available in older CMake versions... +#include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +#find_package_handle_standard_args( +# OpenCL +# FOUND_VAR OpenCL_FOUND +# REQUIRED_VARS OpenCL_LIBRARY OpenCL_INCLUDE_DIR +# VERSION_VAR OpenCL_VERSION_STRING) + +#mark_as_advanced( +# OpenCL_INCLUDE_DIR +# OpenCL_LIBRARY) + +# This replaces FindPackageHandleStandardArgs.cmake, which is not available in older +# CMake versions +if( OpenCL_LIBRARIES AND OpenCL_INCLUDE_DIRS ) + set(OpenCL_FOUND 1) +else() + set(OpenCL_FOUND 0) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index eb48dd8..e72b435 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,13 @@ if(POLICY CMP0053) endif(POLICY CMP0053) +include(CMakeCommon/FindOpenCL.cmake) +IF(NOT OpenCL_FOUND) + MESSAGE( STATUS "OpenCL is not there, will build without MTAPI OpenCL Plugin." ) +ENDIF() + + + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release @@ -150,7 +157,9 @@ add_subdirectory(base_c) add_subdirectory(base_cpp) add_subdirectory(mtapi_c) add_subdirectory(mtapi_network_c) -add_subdirectory(mtapi_opencl_c) +if(OpenCL_FOUND) + add_subdirectory(mtapi_opencl_c) +endif() add_subdirectory(tasks_cpp) add_subdirectory(mtapi_cpp) add_subdirectory(containers_cpp) diff --git a/doc/examples/CMakeLists.txt b/doc/examples/CMakeLists.txt index 8f49812..d68a8a3 100644 --- a/doc/examples/CMakeLists.txt +++ b/doc/examples/CMakeLists.txt @@ -2,6 +2,7 @@ project (project_embb_tutorials) file(GLOB_RECURSE EXAMPLES_SOURCES "*.cc" "*.h") + include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/ ${CMAKE_CURRENT_BINARY_DIR}/ @@ -12,7 +13,6 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../mtapi_c/include ${CMAKE_CURRENT_SOURCE_DIR}/../../mtapi_c/src ${CMAKE_CURRENT_SOURCE_DIR}/../../mtapi_network_c/include - ${CMAKE_CURRENT_SOURCE_DIR}/../../mtapi_opencl_c/include ${CMAKE_CURRENT_SOURCE_DIR}/../../mtapi_cpp/include ${CMAKE_CURRENT_SOURCE_DIR}/../../tasks_cpp/include ${CMAKE_CURRENT_BINARY_DIR}/../../tasks_cpp/include @@ -21,6 +21,21 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../dataflow_cpp/include ) +if(OpenCL_FOUND) + # used in source code, to include opencl code + add_definitions(-DEMBB_WITH_OPENCL) + # add opencl includes + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/../../mtapi_opencl_c/include + ) + # later used, to link opencl to target... + set (EMBB_MTAPI_OPENCL_C_CONDITIONAL "embb_mtapi_opencl_c") +else() + # remove opencl examples from sources (should not be build) + file(GLOB_RECURSE EXAMPLES_SOURCES_OPENCL_TO_REMOVE "*opencl*" ) + list(REMOVE_ITEM EXAMPLES_SOURCES ${EXAMPLES_SOURCES_OPENCL_TO_REMOVE}) +endif() + if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "-std=c++11") set (EXTRA_LIBS dl) @@ -32,7 +47,7 @@ ENDIF() add_executable(examples ${EXAMPLES_SOURCES}) target_link_libraries(examples embb_dataflow_cpp embb_algorithms_cpp embb_tasks_cpp embb_mtapi_cpp - embb_mtapi_network_c embb_mtapi_opencl_c embb_mtapi_c + embb_mtapi_network_c ${EMBB_MTAPI_OPENCL_C_CONDITIONAL} embb_mtapi_c embb_base_cpp embb_base_c embb_containers_cpp ${EXTRA_LIBS} ${compiler_libs}) CopyBin(BIN examples DEST ${local_install_dir}) diff --git a/doc/examples/main.cc b/doc/examples/main.cc index 54414bf..7888d4b 100644 --- a/doc/examples/main.cc +++ b/doc/examples/main.cc @@ -30,7 +30,9 @@ void RunMTAPI_C(); void RunMTAPI_C_Plugin(); void RunMTAPI_C_Network(); +#ifdef EMBB_WITH_OPENCL void RunMTAPI_C_OpenCL(); +#endif void RunMTAPI_CPP(); void RunTasks(); void RunDataflowLinear(); @@ -66,9 +68,11 @@ int main() { RunMTAPI_C_Network(); std::cout << "RunMTAPI_C_Network() ... done" << std::endl; +#ifdef EMBB_WITH_OPENCL std::cout << "RunMTAPI_C_OpenCL() ..." << std::endl; RunMTAPI_C_OpenCL(); std::cout << "RunMTAPI_C_OpenCL() ... done" << std::endl; +#endif std::cout << "RunMTAPI_CPP() ..." << std::endl; RunMTAPI_CPP();