Cycles CUDA: make CUDA toolkit 6.0 the official supported version.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 30 Apr 2014 08:54:17 +0000 (10:54 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 30 Apr 2014 14:07:27 +0000 (16:07 +0200)
This also updates the configurations to build kernels for compute capability
5.0 cards, when using and older CUDA toolkit version this will be skipped.

Also includes tweaks to improve performance with this version:
* Increase max registers on sm_30, sm_35 and sm_50
* No longer use texture storage on sm_30

14 files changed:
CMakeLists.txt
build_files/buildbot/config/user-config-cuda-glibc211-i686.py
build_files/buildbot/config/user-config-cuda-glibc211-x86_64.py
build_files/scons/config/darwin-config.py
build_files/scons/config/linux-config.py
build_files/scons/config/win32-mingw-config.py
build_files/scons/config/win32-vc-config.py
build_files/scons/config/win64-mingw-config.py
build_files/scons/config/win64-vc-config.py
intern/cycles/device/device_cuda.cpp
intern/cycles/kernel/CMakeLists.txt
intern/cycles/kernel/SConscript
intern/cycles/kernel/kernel.cu
intern/cycles/kernel/kernel_compat_cuda.h

index cb104149d3338c5c8a28e1342acf3fff5ac7ac44..53dcb0ce4ad0be34d6dfd74f1f629f6c9ec516f3 100644 (file)
@@ -264,7 +264,7 @@ option(WITH_CYCLES_STANDALONE               "Build cycles standalone application" OFF)
 option(WITH_CYCLES_STANDALONE_GUI      "Build cycles standalone with GUI" OFF)
 option(WITH_CYCLES_OSL                         "Build Cycles with OSL support" OFF)
 option(WITH_CYCLES_CUDA_BINARIES       "Build cycles CUDA binaries" OFF)
-set(CYCLES_CUDA_BINARIES_ARCH sm_20 sm_21 sm_30 sm_35 CACHE STRING "CUDA architectures to build binaries for")
+set(CYCLES_CUDA_BINARIES_ARCH sm_20 sm_21 sm_30 sm_35 sm_50 CACHE STRING "CUDA architectures to build binaries for")
 mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH)
 unset(PLATFORM_DEFAULT)
 
index 69053d7ff3948915b700595f7a81d42ae2d69eae..854f535398b8ba073bce7c80a40dc69b7a5bb57b 100644 (file)
@@ -2,4 +2,4 @@ BF_BUILDDIR = '../blender-build/linux-glibc211-i686'
 BF_INSTALLDIR = '../blender-install/linux-glibc211-i686'
 BF_NUMJOBS = 1
 
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
index c9b765f55acaccfb4e3a04cc5e2f7d17968007b8..7e92894876218d9d27cd9bdfd566b11aaa3182b4 100644 (file)
@@ -2,4 +2,4 @@ BF_BUILDDIR = '../blender-build/linux-glibc211-x86_64'
 BF_INSTALLDIR = '../blender-install/linux-glibc211-x86_64'
 BF_NUMJOBS = 1
 
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
index 2f77c6be6e96ccbf1d597c210e6c4077708bfab3..aac7ed4fa04d6eee17fdfdea6c1c55a4ab18d681 100644 (file)
@@ -199,7 +199,7 @@ BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
 
 WITH_BF_CYCLES_CUDA_BINARIES = False
 BF_CYCLES_CUDA_NVCC = '/usr/local/cuda/bin/nvcc'
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 #Freestyle
 WITH_BF_FREESTYLE = True
index ce2d07f782c992adaaae380738328dbf51833a3a..8f2c5ca30f473c880069deb2a0b4677618609c36 100644 (file)
@@ -206,7 +206,7 @@ WITH_BF_CYCLES = WITH_BF_OIIO and WITH_BF_BOOST
 
 WITH_BF_CYCLES_CUDA_BINARIES = False
 BF_CYCLES_CUDA_NVCC = '/usr/local/cuda/bin/nvcc'
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 WITH_BF_OPENMP = True
 
index 3a5a02fb385684e8905a59bfda93e2de6f3dd2fa..a6d1a7d79966ec139bcfa7d2a830f29c1db73d30 100644 (file)
@@ -145,7 +145,7 @@ BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib/opencollada'
 WITH_BF_CYCLES = True
 WITH_BF_CYCLES_CUDA_BINARIES = False
 BF_CYCLES_CUDA_NVCC = "" # Path to the NVIDIA CUDA compiler
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 WITH_BF_OIIO = True
 BF_OIIO = LIBDIR + '/openimageio'
@@ -175,7 +175,7 @@ WITH_BF_OPENMP = True
 #CUDA
 WITH_BF_CYCLES_CUDA_BINARIES = False
 #BF_CYCLES_CUDA_NVCC = "" # Path to the nvidia compiler
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 #Freestyle
 WITH_BF_FREESTYLE = True
index bb9bcc310ab1c5e4678ccca9174201766d2a5eec..16b105d188de9acd5116276f47520c7b1dc5c873 100644 (file)
@@ -226,7 +226,7 @@ WITH_BF_CYCLES_CUDA_BINARIES = False
 if VC_VERSION == '11.0':
        BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30']
 else:
-       BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+       BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 #Ray trace optimization
 WITH_BF_RAYOPTIMIZATION = True
index 6efbf5b7197a55be187dba1682a553177e10cef6..dcdea6583d7b8d924ceca486f2af972b19ffbf52 100644 (file)
@@ -144,7 +144,7 @@ BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib/opencollada'
 WITH_BF_CYCLES = True
 WITH_BF_CYCLES_CUDA_BINARIES = False
 BF_CYCLES_CUDA_NVCC = "" # Path to the NVIDIA CUDA compiler
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 WITH_BF_OIIO = True
 BF_OIIO = LIBDIR + '/openimageio'
index 9c32972572ce482aa9a39a7ed1aaf4601764ce1a..3ec284ed34a4873960bcfc848f097eea3c314500 100644 (file)
@@ -224,7 +224,7 @@ BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
 #CUDA
 WITH_BF_CYCLES_CUDA_BINARIES = False
 #BF_CYCLES_CUDA_NVCC = "" # Path to the nvidia compiler
-BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35']
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21', 'sm_30', 'sm_35', 'sm_50']
 
 #Ray trace optimization
 WITH_BF_RAYOPTIMIZATION = True
index 0d2f6cdfe195a14cf6cb25fe04e8581de0932236..72453e83864ca3da7d6b6d7171cbda89b12ae58c 100644 (file)
@@ -222,7 +222,7 @@ public:
                /* In order to use full 6GB of memory on Titan cards, use arrays instead
                 * of textures. On earlier cards this seems slower, but on Titan it is
                 * actually slightly faster in tests. */
-               use_texture_storage = (cuDevArchitecture < 350);
+               use_texture_storage = (cuDevArchitecture < 300);
 
                cuda_pop_context();
        }
index 1527d154c86aa5caf4b9f80464e9a8150a6e180b..d18f4fa299833218348dbc6c77f189e270811d98 100644 (file)
@@ -146,11 +146,11 @@ if(WITH_CYCLES_CUDA_BINARIES)
        set(CUDA_VERSION "${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}")
 
        # warn for other versions
-       if(CUDA_VERSION MATCHES "50")
+       if(CUDA_VERSION MATCHES "60")
        else()
                message(WARNING
                        "CUDA version ${CUDA_VERSION_MAJOR}.${CUDA_VERSION_MINOR} detected, "
-                       "build may succeed but only CUDA 5.0 is officially supported")
+                       "build may succeed but only CUDA 6.0 is officially supported")
        endif()
 
        # build for each arch
@@ -162,8 +162,10 @@ if(WITH_CYCLES_CUDA_BINARIES)
 
                set(cuda_version_flags "-D__KERNEL_CUDA_VERSION__=${CUDA_VERSION}")
                set(cuda_math_flags "--use_fast_math")
-               
-               if(CUDA_VERSION LESS 50 AND ${arch} MATCHES "sm_35")
+
+               if(CUDA_VERSION LESS 60 AND ${arch} MATCHES "sm_50")
+                       message(WARNING "Can't build kernel for CUDA sm_50 architecture, skipping")
+               elseif(CUDA_VERSION LESS 50 AND ${arch} MATCHES "sm_35")
                        message(WARNING "Can't build kernel for CUDA sm_35 architecture, skipping")
                else()
                        add_custom_command(
index 5316ec9926bf42369ade6ec6cb45ccb699f55d96..04e1bad75389783eb8bc5034184de9c0e1bf94f8 100644 (file)
@@ -69,8 +69,8 @@ if env['WITH_BF_CYCLES_CUDA_BINARIES']:
     cuda_major_minor = re.findall(r'release (\d+).(\d+)', output)[0]
     cuda_version = int(cuda_major_minor[0])*10 + int(cuda_major_minor[1])
 
-    if cuda_version != 50:
-        print("CUDA version %d.%d detected, build may succeed but only CUDA 5.0 is officially supported." % (cuda_version/10, cuda_version%10))
+    if cuda_version != 60:
+        print("CUDA version %d.%d detected, build may succeed but only CUDA 6.0 is officially supported." % (cuda_version/10, cuda_version%10))
 
     # nvcc flags
     nvcc_flags = "-m%s" % (bits)
@@ -85,6 +85,10 @@ if env['WITH_BF_CYCLES_CUDA_BINARIES']:
 
     # add command for each cuda architecture
     for arch in cuda_archs:
+        if cuda_version < 60 and arch == "sm_50":
+            print("Can't build kernel for CUDA sm_50 architecture, skipping")
+            continue
+
         cubin_file = os.path.join(build_dir, "kernel_%s.cubin" % arch)
 
         if env['BF_CYCLES_CUDA_ENV']:
index d91c6d97123a055b57b068c61c37d9a09513eef5..636e48b5456d4ca3fd5f18b31507f82902e656be 100644 (file)
@@ -49,8 +49,8 @@
 
 /* tunable parameters */
 #define CUDA_THREADS_BLOCK_WIDTH 16
-#define CUDA_KERNEL_MAX_REGISTERS 32
-#define CUDA_KERNEL_BRANCHED_MAX_REGISTERS 40
+#define CUDA_KERNEL_MAX_REGISTERS 63
+#define CUDA_KERNEL_BRANCHED_MAX_REGISTERS 63
 
 /* 5.0 */
 #elif __CUDA_ARCH__ == 500
@@ -61,8 +61,8 @@
 
 /* tunable parameters */
 #define CUDA_THREADS_BLOCK_WIDTH 16
-#define CUDA_KERNEL_MAX_REGISTERS 32
-#define CUDA_KERNEL_BRANCHED_MAX_REGISTERS 40
+#define CUDA_KERNEL_MAX_REGISTERS 63
+#define CUDA_KERNEL_BRANCHED_MAX_REGISTERS 63
 
 /* unknown architecture */
 #else
index 15e7353ec3848f520166308f75b2543d6d0a23dd..e4c20d26ff1686175f817406b659432959cd0b98 100644 (file)
@@ -60,7 +60,7 @@ typedef texture<uchar4, 2, cudaReadModeNormalizedFloat> texture_image_uchar4;
 /* In order to use full 6GB of memory on Titan cards, use arrays instead
  * of textures. On earlier cards this seems slower, but on Titan it is
  * actually slightly faster in tests. */
-#if __CUDA_ARCH__ < 350
+#if __CUDA_ARCH__ < 300
 #define __KERNEL_CUDA_TEX_STORAGE__
 #endif