@@ -18,6 +18,8 @@ package nvcdi
1818
1919import (
2020 "fmt"
21+ "path/filepath"
22+ "strings"
2123
2224 "github.com/NVIDIA/go-nvlib/pkg/nvlib/device"
2325 "github.com/NVIDIA/go-nvlib/pkg/nvlib/info"
@@ -26,6 +28,7 @@ import (
2628
2729 "github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
2830 "github.com/NVIDIA/nvidia-container-toolkit/internal/logger"
31+ "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda"
2932 "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/root"
3033 "github.com/NVIDIA/nvidia-container-toolkit/internal/nvsandboxutils"
3134 "github.com/NVIDIA/nvidia-container-toolkit/internal/platform-support/tegra/csv"
@@ -228,18 +231,36 @@ func (l *nvcdilib) resolveMode() (rmode string) {
228231 return ModeNvml
229232}
230233
231- // getCudaVersion returns the CUDA version of the current system.
232- func (l * nvcdilib ) getCudaVersion () (string , error ) {
233- version , err := l .getCudaVersionNvsandboxutils ()
234- if err == nil {
234+ // getDriverVersion returns the driver version of the current system.
235+ func (l * nvcdilib ) getDriverVersion () (string , error ) {
236+ if version , err := l .getDriverVersionNvsandboxutils (); err == nil && version != "" {
235237 return version , err
236238 }
237239
238240 // Fallback to NVML
239- return l .getCudaVersionNvml ()
241+ if version , err := l .getDriverVersionNvml (); err == nil && version != "" {
242+ return version , err
243+ }
244+
245+ // Fallback to getting the version from the libcuda.so suffix.
246+ return l .getDriverVersionLibcudaSo ()
247+ }
248+
249+ func (l * nvcdilib ) getDriverVersionLibcudaSo () (string , error ) {
250+ libCudaPaths , err := cuda .New (
251+ l .driver .Libraries (),
252+ ).Locate (".*.*" )
253+ if err != nil {
254+ return "" , fmt .Errorf ("failed to locate libcuda.so: %v" , err )
255+ }
256+ libCudaPath := libCudaPaths [0 ]
257+
258+ version := strings .TrimPrefix (filepath .Base (libCudaPath ), "libcuda.so." )
259+
260+ return version , nil
240261}
241262
242- func (l * nvcdilib ) getCudaVersionNvml () (string , error ) {
263+ func (l * nvcdilib ) getDriverVersionNvml () (string , error ) {
243264 if hasNVML , reason := l .infolib .HasNvml (); ! hasNVML {
244265 return "" , fmt .Errorf ("nvml not detected: %v" , reason )
245266 }
@@ -263,7 +284,7 @@ func (l *nvcdilib) getCudaVersionNvml() (string, error) {
263284 return version , nil
264285}
265286
266- func (l * nvcdilib ) getCudaVersionNvsandboxutils () (string , error ) {
287+ func (l * nvcdilib ) getDriverVersionNvsandboxutils () (string , error ) {
267288 if l .nvsandboxutilslib == nil {
268289 return "" , fmt .Errorf ("libnvsandboxutils is not available" )
269290 }
0 commit comments