diff --git a/docs/development.md b/docs/development.md index ac45a3e0..59651b1f 100644 --- a/docs/development.md +++ b/docs/development.md @@ -50,7 +50,8 @@ development and runtime packages. Typically the build scripts will auto-detect CUDA, however, if your Linux distro or installation approach uses unusual paths, you can specify the location by specifying an environment variable `CUDA_LIB_DIR` to the location of the shared -libraries, and `CUDACXX` to the location of the nvcc compiler. +libraries, and `CUDACXX` to the location of the nvcc compiler. You can customize +set set of target CUDA architectues by setting `CMAKE_CUDA_ARCHITECTURES` (e.g. "50;60;70") Then generate dependencies: diff --git a/gpu/gpu.go b/gpu/gpu.go index e234ec39..550467a3 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -30,8 +30,8 @@ type handles struct { var gpuMutex sync.Mutex var gpuHandles *handles = nil -// With our current CUDA compile flags, 5.2 and older will not work properly -const CudaComputeMajorMin = 6 +// With our current CUDA compile flags, older than 5.0 will not work properly +var CudaComputeMin = [2]C.int{5, 0} // Possible locations for the nvidia-ml library var CudaLinuxGlobs = []string{ @@ -142,7 +142,7 @@ func GetGPUInfo() GpuInfo { if cc.err != nil { slog.Info(fmt.Sprintf("error looking up CUDA GPU compute capability: %s", C.GoString(cc.err))) C.free(unsafe.Pointer(cc.err)) - } else if cc.major >= CudaComputeMajorMin { + } else if cc.major > CudaComputeMin[0] || (cc.major == CudaComputeMin[0] && cc.minor >= CudaComputeMin[1]) { slog.Info(fmt.Sprintf("CUDA Compute Capability detected: %d.%d", cc.major, cc.minor)) resp.Library = "cuda" } else { diff --git a/llm/generate/gen_common.sh b/llm/generate/gen_common.sh index 0b7b2ae4..43d3dce5 100644 --- a/llm/generate/gen_common.sh +++ b/llm/generate/gen_common.sh @@ -39,6 +39,9 @@ init_vars() { *) ;; esac + if [ -z "${CMAKE_CUDA_ARCHITECTURES}" ] ; then + CMAKE_CUDA_ARCHITECTURES="50;52;61;70;75;80" + fi } git_module_setup() { diff --git a/llm/generate/gen_linux.sh b/llm/generate/gen_linux.sh index fee4c85f..82c8c75b 100755 --- a/llm/generate/gen_linux.sh +++ b/llm/generate/gen_linux.sh @@ -135,7 +135,7 @@ if [ -d "${CUDA_LIB_DIR}" ]; then if [ -n "${CUDA_MAJOR}" ]; then CUDA_VARIANT=_v${CUDA_MAJOR} fi - CMAKE_DEFS="-DLLAMA_CUBLAS=on ${COMMON_CMAKE_DEFS} ${CMAKE_DEFS}" + CMAKE_DEFS="-DLLAMA_CUBLAS=on -DLLAMA_CUDA_FORCE_MMQ=on -DCMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES} ${COMMON_CMAKE_DEFS} ${CMAKE_DEFS}" BUILD_DIR="${LLAMACPP_DIR}/build/linux/${ARCH}/cuda${CUDA_VARIANT}" EXTRA_LIBS="-L${CUDA_LIB_DIR} -lcudart -lcublas -lcublasLt -lcuda" build diff --git a/llm/generate/gen_windows.ps1 b/llm/generate/gen_windows.ps1 index e4271997..f7a241cc 100644 --- a/llm/generate/gen_windows.ps1 +++ b/llm/generate/gen_windows.ps1 @@ -25,6 +25,11 @@ function init_vars { } $script:GZIP=(get-command -ea 'silentlycontinue' gzip).path $script:DUMPBIN=(get-command -ea 'silentlycontinue' dumpbin).path + if ($null -eq $env:CMAKE_CUDA_ARCHITECTURES) { + $script:CMAKE_CUDA_ARCHITECTURES="50;52;61;70;75;80" + } else { + $script:CMAKE_CUDA_ARCHITECTURES=$env:CMAKE_CUDA_ARCHITECTURES + } } function git_module_setup { @@ -151,7 +156,7 @@ if ($null -ne $script:CUDA_LIB_DIR) { } init_vars $script:buildDir="${script:llamacppDir}/build/windows/${script:ARCH}/cuda$script:CUDA_VARIANT" - $script:cmakeDefs += @("-DLLAMA_CUBLAS=ON", "-DLLAMA_AVX=on") + $script:cmakeDefs += @("-DLLAMA_CUBLAS=ON", "-DLLAMA_AVX=on", "-DCMAKE_CUDA_ARCHITECTURES=${script:CMAKE_CUDA_ARCHITECTURES}") build install cp "${script:CUDA_LIB_DIR}/cudart64_*.dll" "${script:buildDir}/lib"