Intel SPMD Program Compiler on Visual Studio

Introduction

The CMake, from ver. 3.21, supports Intel SPMD Program Compiler (ISPC), but only for make and Ninja. I often use Visual Studio for C++ developments, and so need useful code pieces for CMakeLists.txt.

Functions

This is always included from the root CMakeLists.txt. Ofcourse I know that gathering sources automatically is not recommended.

function(add_ispcs ISPC_OBJECTS FILES)
    set(OBJECT_FILES "")
    foreach(SOURCE_FILE IN LISTS FILES)
        string(REPLACE ".ispc" ".ispc.o" OBJECT_FILE ${SOURCE_FILE})
        get_filename_component(OBJECT_FILE ${OBJECT_FILE} NAME)
        set(OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_FILE})
        set(OBJECT_FILES "${OBJECT_FILES};${OBJECT_FILE}")
        string(REPLACE ".ispc" ".h" HEADER_FILE ${SOURCE_FILE})
        add_custom_command(OUTPUT ${OBJECT_FILE}
            PREBUILD
            COMMAND ${ISPC_BIN} ${SOURCE_FILE} -o ${OBJECT_FILE} --target=${ISPC_TARGET} --arch=${ISPC_ARCH} --cpu=${ISPC_CPU} -h ${HEADER_FILE}
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    endforeach()
    set(${ISPC_OBJECTS} ${OBJECT_FILES} PARENT_SCOPE)
endfunction(add_ispcs)

function(expand_files FILES SOURCE)
    file (GLOB SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE})
    set(${FILES} ${SOURCES} PARENT_SCOPE)
endfunction(expand_files)

function(expand_absolute_files FILES SOURCE)
    file (GLOB SOURCES ${SOURCE})
    set(${FILES} ${SOURCES} PARENT_SCOPE)
endfunction(expand_absolute_files)
set(TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR})

expand_absolute_files(TEST_INCLUDES "${TEST_ROOT}/*.h")
expand_absolute_files(TEST_SOURCES "${TEST_ROOT}/*.cpp")
expand_absolute_files(TEST_ISPHS "${TEST_ROOT}/*.isph")
expand_absolute_files(TEST_ISPCS "${TEST_ROOT}/*.ispc")

source_group("ispc" FILES ${TEST_ISPHS})
source_group("ispc" FILES ${TEST_ISPCS})

set(FILES ${TEST_INCLUDES} ${TEST_SOURCES} ${TEST_ISPHS} ${TEST_ISPCS})
add_ispcs(TEST_ISPC_OBJECTS "${TEST_ISPCS}")
add_executable(${PROJECT_NAME} ${FILES} ${TEST_ISPC_OBJECTS})

Required variables,

  • ISPC_BIN: Path to ISPC executable
  • ISPC_TARGET: ‘sse2’, ‘avx1’, ‘avx2’, …
  • ISPC_ARCH: ‘x86’, ‘x86-64’, ‘aarch64’, …
  • ISPC_CPU: ‘core-avx2’, …