ispc.cmake 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. ## ======================================================================== ##
  2. ## Copyright 2009-2017 Intel Corporation ##
  3. ## ##
  4. ## Licensed under the Apache License, Version 2.0 (the "License"); ##
  5. ## you may not use this file except in compliance with the License. ##
  6. ## You may obtain a copy of the License at ##
  7. ## ##
  8. ## http://www.apache.org/licenses/LICENSE-2.0 ##
  9. ## ##
  10. ## Unless required by applicable law or agreed to in writing, software ##
  11. ## distributed under the License is distributed on an "AS IS" BASIS, ##
  12. ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ##
  13. ## See the License for the specific language governing permissions and ##
  14. ## limitations under the License. ##
  15. ## ======================================================================== ##
  16. # ##################################################################
  17. # add macro INCLUDE_DIRECTORIES_ISPC() that allows to specify search
  18. # paths for ISPC sources
  19. # ##################################################################
  20. SET(ISPC_INCLUDE_DIR "")
  21. MACRO (INCLUDE_DIRECTORIES_ISPC)
  22. SET(ISPC_INCLUDE_DIR ${ISPC_INCLUDE_DIR} ${ARGN})
  23. ENDMACRO ()
  24. IF (EMBREE_ISPC_SUPPORT)
  25. # ISPC versions to look for, in decending order (newest first)
  26. SET(ISPC_VERSION_WORKING "1.9.1" "1.9.0" "1.8.3" "1.8.2")
  27. LIST(GET ISPC_VERSION_WORKING -1 ISPC_VERSION_REQUIRED)
  28. IF (NOT EMBREE_ISPC_EXECUTABLE)
  29. # try sibling folder as hint for path of ISPC
  30. IF (APPLE)
  31. SET(ISPC_DIR_SUFFIX "osx")
  32. ELSEIF(WIN32)
  33. SET(ISPC_DIR_SUFFIX "windows")
  34. IF (MSVC14)
  35. LIST(APPEND ISPC_DIR_SUFFIX "windows-vs2015")
  36. ELSE()
  37. LIST(APPEND ISPC_DIR_SUFFIX "windows-vs2013")
  38. ENDIF()
  39. ELSE()
  40. SET(ISPC_DIR_SUFFIX "linux")
  41. ENDIF()
  42. FOREACH(ver ${ISPC_VERSION_WORKING})
  43. FOREACH(suffix ${ISPC_DIR_SUFFIX})
  44. LIST(APPEND ISPC_DIR_HINT ${PROJECT_SOURCE_DIR}/../ispc-v${ver}-${suffix})
  45. ENDFOREACH()
  46. ENDFOREACH()
  47. FIND_PROGRAM(EMBREE_ISPC_EXECUTABLE ispc PATHS ${ISPC_DIR_HINT} DOC "Path to the ISPC executable.")
  48. IF (NOT EMBREE_ISPC_EXECUTABLE)
  49. MESSAGE(FATAL_ERROR "Intel SPMD Compiler (ISPC) not found. Disable EMBREE_ISPC_SUPPORT or install ISPC.")
  50. ELSE()
  51. MESSAGE(STATUS "Found Intel SPMD Compiler (ISPC): ${EMBREE_ISPC_EXECUTABLE}")
  52. ENDIF()
  53. ENDIF()
  54. # check ISPC version
  55. EXECUTE_PROCESS(COMMAND ${EMBREE_ISPC_EXECUTABLE} --version OUTPUT_VARIABLE ISPC_OUTPUT)
  56. STRING(REGEX MATCH " ([0-9]+[.][0-9]+[.][0-9]+)(dev|knl)? " DUMMY "${ISPC_OUTPUT}")
  57. SET(ISPC_VERSION ${CMAKE_MATCH_1})
  58. IF (ISPC_VERSION VERSION_LESS ISPC_VERSION_REQUIRED)
  59. MESSAGE(FATAL_ERROR "Need at least version ${ISPC_VERSION_REQUIRED} of Intel SPMD Compiler (ISPC).")
  60. ENDIF()
  61. GET_FILENAME_COMPONENT(ISPC_DIR ${EMBREE_ISPC_EXECUTABLE} PATH)
  62. SET(EMBREE_ISPC_ADDRESSING 32 CACHE INT "32vs64 bit addressing in ispc")
  63. MARK_AS_ADVANCED(EMBREE_ISPC_ADDRESSING)
  64. MACRO (ISPC_COMPILE)
  65. SET(ISPC_ADDITIONAL_ARGS "")
  66. SET(ISPC_TARGET_EXT ${CMAKE_CXX_OUTPUT_EXTENSION})
  67. STRING(REPLACE ";" "," ISPC_TARGET_ARGS "${ISPC_TARGETS}")
  68. IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
  69. SET(ISPC_ARCHITECTURE "x86-64")
  70. ELSE()
  71. SET(ISPC_ARCHITECTURE "x86")
  72. ENDIF()
  73. SET(ISPC_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR})
  74. IF(ISPC_INCLUDE_DIR)
  75. STRING(REPLACE ";" ";-I;" ISPC_INCLUDE_DIR_PARMS "${ISPC_INCLUDE_DIR}")
  76. SET(ISPC_INCLUDE_DIR_PARMS "-I" ${ISPC_INCLUDE_DIR_PARMS})
  77. ENDIF()
  78. IF (WIN32 OR "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
  79. SET(ISPC_OPT_FLAGS -O3)
  80. ELSE()
  81. SET(ISPC_OPT_FLAGS -O2 -g)
  82. ENDIF()
  83. IF (WIN32)
  84. SET(ISPC_ADDITIONAL_ARGS ${ISPC_ADDITIONAL_ARGS} --dllexport)
  85. ELSE()
  86. SET(ISPC_ADDITIONAL_ARGS ${ISPC_ADDITIONAL_ARGS} --pic)
  87. ENDIF()
  88. SET(ISPC_OBJECTS "")
  89. FOREACH(src ${ARGN})
  90. GET_FILENAME_COMPONENT(fname ${src} NAME_WE)
  91. GET_FILENAME_COMPONENT(dir ${src} PATH)
  92. SET(outdir "${ISPC_TARGET_DIR}/${dir}")
  93. SET(input ${CMAKE_CURRENT_SOURCE_DIR}/${src})
  94. SET(deps "")
  95. IF (EXISTS ${outdir}/${fname}.dev.idep)
  96. FILE(READ ${outdir}/${fname}.dev.idep contents)
  97. STRING(REPLACE " " ";" contents "${contents}")
  98. STRING(REPLACE ";" "\\\\;" contents "${contents}")
  99. STRING(REPLACE "\n" ";" contents "${contents}")
  100. FOREACH(dep ${contents})
  101. IF (EXISTS ${dep})
  102. SET(deps ${deps} ${dep})
  103. ENDIF (EXISTS ${dep})
  104. ENDFOREACH(dep ${contents})
  105. ENDIF ()
  106. SET(results "${outdir}/${fname}.dev${ISPC_TARGET_EXT}")
  107. # if we have multiple targets add additional object files
  108. LIST(LENGTH ISPC_TARGETS NUM_TARGETS)
  109. IF (NUM_TARGETS GREATER 1)
  110. FOREACH(target ${ISPC_TARGETS})
  111. # in v1.9.0 ISPC changed the ISA suffix of avx512knl-i32x16 to just 'avx512knl'
  112. IF (${target} STREQUAL "avx512knl-i32x16" AND NOT ISPC_VERSION VERSION_LESS "1.9.0")
  113. SET(target "avx512knl")
  114. ELSEIF (${target} STREQUAL "avx512skx-i32x16")
  115. SET(target "avx512skx")
  116. ENDIF()
  117. SET(results ${results} "${outdir}/${fname}.dev_${target}${ISPC_TARGET_EXT}")
  118. ENDFOREACH()
  119. ENDIF()
  120. ADD_CUSTOM_COMMAND(
  121. OUTPUT ${results} ${ISPC_TARGET_DIR}/${fname}_ispc.h
  122. COMMAND ${CMAKE_COMMAND} -E make_directory ${outdir}
  123. COMMAND ${EMBREE_ISPC_EXECUTABLE}
  124. -I ${CMAKE_CURRENT_SOURCE_DIR}
  125. ${ISPC_INCLUDE_DIR_PARMS}
  126. --arch=${ISPC_ARCHITECTURE}
  127. --addressing=${EMBREE_ISPC_ADDRESSING}
  128. ${ISPC_OPT_FLAGS}
  129. --target=${ISPC_TARGET_ARGS}
  130. --woff
  131. --opt=fast-math
  132. ${ISPC_ADDITIONAL_ARGS}
  133. -h ${ISPC_TARGET_DIR}/${fname}_ispc.h
  134. -MMM ${outdir}/${fname}.dev.idep
  135. -o ${outdir}/${fname}.dev${ISPC_TARGET_EXT}
  136. ${input}
  137. DEPENDS ${input} ${deps}
  138. COMMENT "Building ISPC object ${outdir}/${fname}.dev${ISPC_TARGET_EXT}"
  139. )
  140. SET(ISPC_OBJECTS ${ISPC_OBJECTS} ${results})
  141. ENDFOREACH()
  142. ENDMACRO()
  143. MACRO (ADD_EMBREE_ISPC_EXECUTABLE name)
  144. SET(ISPC_SOURCES "")
  145. SET(OTHER_SOURCES "")
  146. FOREACH(src ${ARGN})
  147. GET_FILENAME_COMPONENT(ext ${src} EXT)
  148. IF (ext STREQUAL ".ispc")
  149. SET(ISPC_SOURCES ${ISPC_SOURCES} ${src})
  150. ELSE ()
  151. SET(OTHER_SOURCES ${OTHER_SOURCES} ${src})
  152. ENDIF ()
  153. ENDFOREACH()
  154. ISPC_COMPILE(${ISPC_SOURCES})
  155. ADD_EXECUTABLE(${name} ${ISPC_OBJECTS} ${OTHER_SOURCES})
  156. ENDMACRO()
  157. MACRO (ADD_ISPC_LIBRARY name type)
  158. SET(ISPC_SOURCES "")
  159. SET(OTHER_SOURCES "")
  160. FOREACH(src ${ARGN})
  161. GET_FILENAME_COMPONENT(ext ${src} EXT)
  162. IF (ext STREQUAL ".ispc")
  163. SET(ISPC_SOURCES ${ISPC_SOURCES} ${src})
  164. ELSE ()
  165. SET(OTHER_SOURCES ${OTHER_SOURCES} ${src})
  166. ENDIF ()
  167. ENDFOREACH()
  168. ISPC_COMPILE(${ISPC_SOURCES})
  169. ADD_LIBRARY(${name} ${type} ${ISPC_OBJECTS} ${OTHER_SOURCES})
  170. ENDMACRO()
  171. ELSE (EMBREE_ISPC_SUPPORT)
  172. MACRO (ADD_ISPC_LIBRARY name type)
  173. SET(ISPC_SOURCES "")
  174. SET(OTHER_SOURCES "")
  175. FOREACH(src ${ARGN})
  176. GET_FILENAME_COMPONENT(ext ${src} EXT)
  177. IF (ext STREQUAL ".ispc")
  178. SET(ISPC_SOURCES ${ISPC_SOURCES} ${src})
  179. ELSE ()
  180. SET(OTHER_SOURCES ${OTHER_SOURCES} ${src})
  181. ENDIF ()
  182. ENDFOREACH()
  183. ADD_LIBRARY(${name} ${type} ${OTHER_SOURCES})
  184. ENDMACRO()
  185. ENDIF (EMBREE_ISPC_SUPPORT)