[Bf-blender-cvs] [2af7637] master: Cycles: Add option to directly link against CUDA libraries

Sergey Sharybin noreply at git.blender.org
Thu Jan 14 08:28:10 CET 2016


Commit: 2af7637f207c420af602f43e514b1b20e7cfc718
Author: Sergey Sharybin
Date:   Thu Jan 14 12:24:09 2016 +0500
Branches: master
https://developer.blender.org/rB2af7637f207c420af602f43e514b1b20e7cfc718

Cycles: Add option to directly link against CUDA libraries

The main purpose of such linking is to make Blender compatible with
NVidia's debuggers and profilers which are doing some LD_PRELOAD
magic to intercept some function calls. Such magic conflicts with
our CUDA wrangler magic and causes segmentation faults.

The option is disabled by default, so there's no affect on any of
artists.

In order to make Blender linked directly against CUDA library use
the WITH_CUDA_DYNLOAD CMake option (it's marked as advanced).

===================================================================

M	CMakeLists.txt
M	build_files/cmake/macros.cmake
M	extern/CMakeLists.txt
M	intern/cycles/app/CMakeLists.txt
M	intern/cycles/cmake/external_libs.cmake
M	intern/cycles/device/CMakeLists.txt
M	intern/cycles/device/device_cuda.cpp
M	source/blenderplayer/CMakeLists.txt

===================================================================

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d9d515..73d219e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -399,6 +399,9 @@ mark_as_advanced(WITH_CYCLES_LOGGING)
 mark_as_advanced(WITH_CYCLES_DEBUG)
 mark_as_advanced(WITH_CYCLES_WERROR)
 
+option(WITH_CUDA_DYNLOAD "Dynamically load CUDA libraries at runtime" ON)
+mark_as_advanced(WITH_CUDA_DYNLOAD)
+
 # LLVM
 option(WITH_LLVM					"Use LLVM" OFF)
 if(APPLE)
@@ -2906,7 +2909,9 @@ if(WITH_BLENDER OR WITH_PLAYER)
 elseif(WITH_CYCLES_STANDALONE)
 	add_subdirectory(intern/cycles)
 	add_subdirectory(extern/clew)
-	add_subdirectory(extern/cuew)
+	if(WITH_CUDA_DYNLOAD)
+		add_subdirectory(extern/cuew)
+	endif()
 	if(NOT WITH_SYSTEM_GLEW)
 		add_subdirectory(extern/glew)
 	endif()
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index cacc741..a8e17c3 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -478,7 +478,11 @@ function(setup_liblinks
 	# We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
 	if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
 		target_link_libraries(${target} "extern_clew")
-		target_link_libraries(${target} "extern_cuew")
+		if(WITH_CUDA_DYNLOAD)
+			target_link_libraries(${target} "extern_cuew")
+		else()
+			target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
+		endif()
 	endif()
 
 	#system libraries with no dependencies such as platform link libs or opengl should go last
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 632b68e..82b13cc 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -74,7 +74,9 @@ endif()
 
 if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
 	add_subdirectory(clew)
-	add_subdirectory(cuew)
+	if(WITH_CUDA_DYNLOAD)
+		add_subdirectory(cuew)
+	endif()
 endif()
 
 if(WITH_MOD_BOOLEAN)
diff --git a/intern/cycles/app/CMakeLists.txt b/intern/cycles/app/CMakeLists.txt
index 95bc517..4123328 100644
--- a/intern/cycles/app/CMakeLists.txt
+++ b/intern/cycles/app/CMakeLists.txt
@@ -29,9 +29,14 @@ set(LIBRARIES
 	${TIFF_LIBRARY}
 	${PTHREADS_LIBRARIES}
 	extern_clew
-	extern_cuew
 )
 
+if(WITH_CUDA_DYNLOAD)
+	list(APPEND LIBRARIES extern_cuew)
+else()
+	list(APPEND LIBRARIES ${CUDA_CUDA_LIBRARY})
+endif()
+
 if(WITH_CYCLES_OSL)
 	list(APPEND LIBRARIES cycles_kernel_osl)
 endif()
diff --git a/intern/cycles/cmake/external_libs.cmake b/intern/cycles/cmake/external_libs.cmake
index 56ab8be..fc75efa 100644
--- a/intern/cycles/cmake/external_libs.cmake
+++ b/intern/cycles/cmake/external_libs.cmake
@@ -37,7 +37,7 @@ endif()
 ###########################################################################
 # CUDA
 
-if(WITH_CYCLES_CUDA_BINARIES)
+if(WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DUNLOAD)
 	find_package(CUDA) # Try to auto locate CUDA toolkit
 	if(CUDA_FOUND)
 		message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")
diff --git a/intern/cycles/device/CMakeLists.txt b/intern/cycles/device/CMakeLists.txt
index b0fa283..220b16b 100644
--- a/intern/cycles/device/CMakeLists.txt
+++ b/intern/cycles/device/CMakeLists.txt
@@ -11,10 +11,17 @@ set(INC
 
 set(INC_SYS
 	${GLEW_INCLUDE_DIR}
-	../../../extern/cuew/include
 	../../../extern/clew/include
 )
 
+if(WITH_CUDA_DYNLOAD)
+	list(APPEND INC ../../../extern/cuew/include)
+	add_definitions(-DWITH_CUDA_DYNLOAD)
+else()
+	list(APPEND INC_SYS ${CUDA_TOOLKIT_INCLUDE})
+	add_definitions(-DCYCLES_CUDA_NVCC_EXECUTABLE="${CUDA_NVCC_EXECUTABLE}")
+endif()
+
 set(SRC
 	device.cpp
 	device_cpu.cpp
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 5c9ca34..88f1a86 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -23,7 +23,13 @@
 
 #include "buffers.h"
 
-#include "cuew.h"
+#ifdef WITH_CUDA_DYNLOAD
+#  include "cuew.h"
+#else
+#  include "util_opengl.h"
+#  include <cuda.h>
+#  include <cudaGL.h>
+#endif
 #include "util_debug.h"
 #include "util_logging.h"
 #include "util_map.h"
@@ -42,6 +48,40 @@
 
 CCL_NAMESPACE_BEGIN
 
+#ifndef WITH_CUDA_DYNLOAD
+
+/* Transparently implement some functions, so majority of the file does not need
+ * to worry about difference between dynamically loaded and linked CUDA at all.
+ */
+
+namespace {
+
+const char *cuewErrorString(CUresult result)
+{
+	/* We can only give error code here without major code duplication, that
+	 * should be enough since dynamic loading is only being disabled by folks
+	 * who knows what they're doing anyway.
+	 *
+	 * NOTE: Avoid call from several threads.
+	 */
+	static string error;
+	error = string_printf("%d", result);
+	return error.c_str();
+}
+
+const char *cuewCompilerPath(void)
+{
+	return CYCLES_CUDA_NVCC_EXECUTABLE;
+}
+
+int cuewCompilerVersion(void)
+{
+	return (CUDA_VERSION / 100) + (CUDA_VERSION % 100 / 10);
+}
+
+}  /* namespace */
+#endif  /* WITH_CUDA_DYNLOAD */
+
 class CUDADevice : public Device
 {
 public:
@@ -1100,6 +1140,7 @@ public:
 
 bool device_cuda_init(void)
 {
+#ifdef WITH_CUDA_DYNLOAD
 	static bool initialized = false;
 	static bool result = false;
 
@@ -1133,6 +1174,9 @@ bool device_cuda_init(void)
 	}
 
 	return result;
+#else  /* WITH_CUDA_DYNLOAD */
+	return true;
+#endif /* WITH_CUDA_DYNLOAD */
 }
 
 Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background)
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index f630bef..e8c710e 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -255,5 +255,9 @@ setup_liblinks(blenderplayer)
 # We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
 if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
 	target_link_libraries(blenderplayer "extern_clew")
-	target_link_libraries(blenderplayer "extern_cuew")
+	if(WITH_CUDA_DYNLOAD)
+		target_link_libraries(blenderplayer "extern_cuew")
+	else()
+		target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
+	endif()
 endif()




More information about the Bf-blender-cvs mailing list