NVIDIA driver - what does the 'toolkit' option mean? - cuda

Not a duplicate of this question
When downloading NVIDIA GPU drivers, I've also been asked for some time which CUDA toolkit I prefer.
Now, what does this choice imply when downloading a driver?
As far as I know, different CUDA toolkits have different minimum drivers supporting them (also stated in the release notes), but what does this choice at the driver download page imply?

Generally speaking, there is a backwards compatibility strategy for drivers with respect to CUDA toolkits. For example, the latest driver should work with any older CUDA toolkit. An older driver may not work with a newer CUDA toolkit.
That is a general statement of compatibility. You can find it expressed here (e.g. table 1) also.
However, each CUDA toolkit ships with a particular driver branch. For example CUDA 10.1 ships with a 418.xx driver branch (this corresponds to the version of the GPU driver that is bundled with the CUDA toolkit installer).
So even though a 430.xx driver is compatible with and should work with CUDA 10.1, that isn't actually the driver branch that ships with CUDA 10.1
The dropdown allows you to select a driver that is in the same branch as the driver that particular CUDA toolkit was shipped with and has the highest test coverage with.

Related

NVCC: is it possible to target an earlier driver while compiling with the most recent toolkit?

I've recently downloaded and successfully compiled a small CUDA dll using NVCC (10.2). Unfortunately because I have the most recent toolkit version the distribution requires the most recent driver version too. So I was wondering if there was an NVCC flag that enabled me to effectively target an earlier driver version and then distribute with an older runtime.
Currently, I have to check the run time and driver versions in order to check for compatibility.
The CUDA toolchain, runtime API and its support libraries are versioned and if you build runtime API code with a given toolkit version, you must ship the resulting code with all the libraries from that version or have users install that toolkit version (aka the tensorflow problem).
If you use the driver API, then you can potentially target a lower compute capability with PTX which might be backward compatible with a different driver. I say might because there are still PTX version support limits which can stop it from working correctly.
If you want to support older CUDA versions, just install the older toolchain and build using that toolkit.

cudart_static - when is it necessary?

Since newer drivers ship with the CUDA runtime (I can choose 9.1 or 9.2 in the drivers download page) my question is: should my library (which uses a CUDA kernel internally) be shipped with -lcudart_static?
I had issues launching kernels compiled with 9.2 on systems which used 9.1 CUDA drivers. What's the most 'compatible' way of ensuring my library will run everywhere a recent CUDA driver is installed? (I'm already compiling for a virtual architecture)
Since newer drivers ship with the CUDA runtime (I can choose 9.1 or 9.2 in the drivers download page)
No, that's incorrect. That choice in the drivers download page is related to the fact that each CUDA version has a minimum required driver version associated with it. It does not mean that the driver ships with the CUDA runtime (stated another way, the driver does not install libcudart.so on linux and never has - with some careful experimentation on a clean install, you can prove this to yourself.)
Some additional comments:
-lcudart_static is actually the default for current/recent versions of nvcc. You can discover this by reading the nvcc manual. Therefore, by default, your executable, when compiled/built with nvcc should already be statically linked to the CUDA runtime library corresponding to the version of nvcc that you are using for compilation. The reason you might need to specify this or something like this is if you are building an application with e.g. the gnu toolchain (on linux) rather than nvcc.
The purpose of static linking to the CUDA runtime library is, as you surmise, so that an application can be built in such a way that it does not need an installation of the CUDA toolkit to run properly. It only needs a machine with a proper GPU driver install.
The most compatible way to ensure that an application will run on a range of machines with a range of GPU driver installs is to compile your application using the oldest CUDA toolkit required to meet the needs of the earliest GPU driver in the range you intend to cover. Again, you can refer to the table here.

Is CUDA Toolkit package contains newest NVidia driver?

Is CUDA Toolkit package (Local Installer) contains newest NVidia standard driver? Standard I mean most popular.
For example driver for geforce family like 347.88?
No.
The cuda toolkit installers are a snapshot in time. They contain a reasonably current driver at that time, but as time goes by, newer drivers are released, and these don't automatically appear in a given toolkit installer.

CUDA on Mac OS X 10.6.8, GeForce 9400M

My run time system gives an error "CUDA driver version is insufficient for CUDA runtime version" when I try to run CUDA programs on Mac OS X 10.6.8 installed with CUDA ToolKit 5.0 (CUDA driver: 5.0.45) and GPU driver: 1.6.36.10 for GeForce 900M. I was unable to locate the correct (updated) GPU drivers for GeForce 900M at NVIDIA site. Kindly suggest a solution.
A given CUDA version (e.g. 5.0) has a minimum GPU driver version associated with it. Any newer version should work, but versions older than the minimum driver version will give an error, as you are seeing.
based on my memory:
cuda 4.0: 270.41.19
cuda 5.0: 304.54
cuda 5.5: 319.37
The above may be approximate, but it gives you an idea. For CUDA 4.0, for example, any GPU driver that is 270.41.19 or newer should work. An older driver (like 256.02) would not work. I don't recall the minimum driver versions for other CUDA versions, but it's not difficult to determine, by visiting the various CUDA download pages.
The most recent driver for your platform appears to be 256.02. Even CUDA 4.0 requires 270.41.19 or newer. So the most recent CUDA version you could use with 256.02 would be CUDA 3.2 The solution in that case, would be to upgrade your GPU driver to 256.02, and remove the CUDA 5.0 toolkit and install CUDA 3.2.
CUDA 3.2 is pretty old, so there will be many features that will be unavailable in that version. You'll want to have appropriate versions of the documentation, which will be installed on your machine along with the CUDA toolkit (e.g. in /usr/local/cuda/doc or similar)

NVIDIA CUDA: What is the developer driver?

To develop NVIDIA CUDA programs, the tools needed are:
Developer drivers
CUDA Toolkit
GPU Computing SDK
What is this developer driver? Installing it silently overrides any NVIDIA graphics driver that is already installed. So, how is the developer driver different from the usual NVIDIA graphics driver? What extra components or functionality does it contain?
The developer driver is available in both 32-bit and 64-bit flavours. If I am developing 32-bit Visual C++/CUDA projects on 64-bit Windows 7, which flavour of the developer driver do I choose? Why?
From the developer download page:
Note: The developer driver packages below provide baseline support for the widest number of NVIDIA products in the smallest number of installers. More recent production driver packages for developers and end users may be available at www.nvidia.com/drivers.
The developer driver is released with the Toolkit and is intended to have wide support for all CUDA capable devices. On the other hand the drivers on the main driver page are released as appropriate; the main drivers have full support for CUDA, but each one may support a subset of devices.
Incidentally, when you install a NVIDIA driver it tells you what version is currently installed and what version you're installing (unless you choose a silent install!).