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).
This commit is contained in:
Sergey Sharybin
2016-01-14 12:24:09 +05:00
parent d67535eea0
commit 2af7637f20
8 changed files with 79 additions and 8 deletions

View File

@@ -399,6 +399,9 @@ mark_as_advanced(WITH_CYCLES_LOGGING)
mark_as_advanced(WITH_CYCLES_DEBUG) mark_as_advanced(WITH_CYCLES_DEBUG)
mark_as_advanced(WITH_CYCLES_WERROR) mark_as_advanced(WITH_CYCLES_WERROR)
option(WITH_CUDA_DYNLOAD "Dynamically load CUDA libraries at runtime" ON)
mark_as_advanced(WITH_CUDA_DYNLOAD)
# LLVM # LLVM
option(WITH_LLVM "Use LLVM" OFF) option(WITH_LLVM "Use LLVM" OFF)
if(APPLE) if(APPLE)
@@ -2906,7 +2909,9 @@ if(WITH_BLENDER OR WITH_PLAYER)
elseif(WITH_CYCLES_STANDALONE) elseif(WITH_CYCLES_STANDALONE)
add_subdirectory(intern/cycles) add_subdirectory(intern/cycles)
add_subdirectory(extern/clew) add_subdirectory(extern/clew)
add_subdirectory(extern/cuew) if(WITH_CUDA_DYNLOAD)
add_subdirectory(extern/cuew)
endif()
if(NOT WITH_SYSTEM_GLEW) if(NOT WITH_SYSTEM_GLEW)
add_subdirectory(extern/glew) add_subdirectory(extern/glew)
endif() endif()

View File

@@ -478,7 +478,11 @@ function(setup_liblinks
# We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them.. # We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV) if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
target_link_libraries(${target} "extern_clew") 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() endif()
#system libraries with no dependencies such as platform link libs or opengl should go last #system libraries with no dependencies such as platform link libs or opengl should go last

View File

@@ -74,7 +74,9 @@ endif()
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV) if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
add_subdirectory(clew) add_subdirectory(clew)
add_subdirectory(cuew) if(WITH_CUDA_DYNLOAD)
add_subdirectory(cuew)
endif()
endif() endif()
if(WITH_MOD_BOOLEAN) if(WITH_MOD_BOOLEAN)

View File

@@ -29,9 +29,14 @@ set(LIBRARIES
${TIFF_LIBRARY} ${TIFF_LIBRARY}
${PTHREADS_LIBRARIES} ${PTHREADS_LIBRARIES}
extern_clew 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) if(WITH_CYCLES_OSL)
list(APPEND LIBRARIES cycles_kernel_osl) list(APPEND LIBRARIES cycles_kernel_osl)
endif() endif()

View File

@@ -37,7 +37,7 @@ endif()
########################################################################### ###########################################################################
# CUDA # 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 find_package(CUDA) # Try to auto locate CUDA toolkit
if(CUDA_FOUND) if(CUDA_FOUND)
message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}") message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")

View File

@@ -11,10 +11,17 @@ set(INC
set(INC_SYS set(INC_SYS
${GLEW_INCLUDE_DIR} ${GLEW_INCLUDE_DIR}
../../../extern/cuew/include
../../../extern/clew/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 set(SRC
device.cpp device.cpp
device_cpu.cpp device_cpu.cpp

View File

@@ -23,7 +23,13 @@
#include "buffers.h" #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_debug.h"
#include "util_logging.h" #include "util_logging.h"
#include "util_map.h" #include "util_map.h"
@@ -42,6 +48,40 @@
CCL_NAMESPACE_BEGIN 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 class CUDADevice : public Device
{ {
public: public:
@@ -1100,6 +1140,7 @@ public:
bool device_cuda_init(void) bool device_cuda_init(void)
{ {
#ifdef WITH_CUDA_DYNLOAD
static bool initialized = false; static bool initialized = false;
static bool result = false; static bool result = false;
@@ -1133,6 +1174,9 @@ bool device_cuda_init(void)
} }
return result; return result;
#else /* WITH_CUDA_DYNLOAD */
return true;
#endif /* WITH_CUDA_DYNLOAD */
} }
Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background) Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background)

View File

@@ -255,5 +255,9 @@ setup_liblinks(blenderplayer)
# We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them.. # We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV) if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
target_link_libraries(blenderplayer "extern_clew") 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() endif()