From c992fd3a3c13763f458e420507f044ec82155a81 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Wed, 2 Sep 2020 09:19:44 -0600 Subject: [PATCH] Cycles: Support WITH_CYCLES_NATIVE_ONLY with MSVC This change enables the developer option `WITH_CYCLES_NATIVE_ONLY` for MSVC. This allows a developer to just build the cycles CPU kernel for their specific system rather than all kernels, speeding up development. Other platforms have had this option for years, but MSVC lacks the compiler switch to target the host architecture hence it always build all kernels. This change uses a small helper program to detect the required flags. Only AVX/AVX2 are tested, for the following reasons - SSE2 is enabled by default and requires no flags - SSE3/4 have no specific build flags for msvc - AVX512 is not yet supported by cycles Differential Revision: https://developer.blender.org/D8775 Reviewed by: brecht, sergey --- intern/cycles/CMakeLists.txt | 16 +++++++++++ intern/cycles/cmake/msvc_arch_flags.c | 38 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 intern/cycles/cmake/msvc_arch_flags.c diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index e5a5e9773d3..0dd182526b1 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -33,6 +33,22 @@ if(WITH_CYCLES_NATIVE_ONLY) if(NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") set(CYCLES_KERNEL_FLAGS "-march=native") + else() + if(NOT MSVC_NATIVE_ARCH_FLAGS) + TRY_RUN( + arch_run_result + arch_compile_result + ${CMAKE_CURRENT_BINARY_DIR}/ + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/msvc_arch_flags.c + COMPILE_OUTPUT_VARIABLE arch_compile_output + RUN_OUTPUT_VARIABLE arch_run_output + ) + if (arch_compile_result AND "${arch_run_result}" EQUAL "0") + string(STRIP ${arch_run_output} arch_run_output) + set(MSVC_NATIVE_ARCH_FLAGS ${arch_run_output} CACHE STRING "MSVC Native architecture flags") + endif() + endif() + set(CYCLES_KERNEL_FLAGS "${MSVC_NATIVE_ARCH_FLAGS}") endif() elseif(NOT WITH_CPU_SSE) set(CXX_HAS_SSE FALSE) diff --git a/intern/cycles/cmake/msvc_arch_flags.c b/intern/cycles/cmake/msvc_arch_flags.c new file mode 100644 index 00000000000..79dbd3b87ac --- /dev/null +++ b/intern/cycles/cmake/msvc_arch_flags.c @@ -0,0 +1,38 @@ +/* + * Copyright 2011-2020 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +/* The MS CRT defines this */ +extern int __isa_available; + +const char* get_arch_flags() +{ + if (__isa_available >= __ISA_AVAILABLE_AVX2) { + return "/arch:AVX2"; + } + if (__isa_available >= __ISA_AVAILABLE_AVX) { + return "/arch:AVX"; + } + return ""; +} + +int main() +{ + printf("%s\n", get_arch_flags()); + return 0; +}