Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Root access required for CUDA?

Tags:

cuda

root

I am using GeForce 8400M GS on Ubuntu 10.04 and I am learning CUDA programming. I am writing and running few basic programs. I was using cudaMalloc, and it kept giving me an error until I ran the code as root. However, I had to run the code as root only once. After that, even if I run the code as normal user, I do not get an error on malloc. What's going on?

like image 412
gmemon Avatar asked Jun 19 '12 15:06

gmemon


People also ask

How do I know if my system is CUDA-capable?

To check if your computer has an NVIDA GPU and if it is CUDA enabled: Right click on the Windows desktop. If you see “NVIDIA Control Panel” or “NVIDIA Display” in the pop up dialogue, the computer has an NVIDIA GPU. Click on “NVIDIA Control Panel” or “NVIDIA Display” in the pop up dialogue.

Can I install CUDA locally?

3.1. When installing CUDA on OpenSUSE, you can choose between the Runfile Installer and the RPM Installer. The Runfile Installer is only available as a Local Installer. The RPM Installer is available as both a Local Installer and a Network Installer. The Network Installer allows you to download only the files you need.

Can I use CUDA in Linux?

System Requirements. To use NVIDIA CUDA on your system, you will need the following installed: CUDA-capable GPU. A supported version of Linux with a gcc compiler and toolchain.


2 Answers

This is probably due to your GPU not being properly initialized at boot. I've come across this problem when using Ubuntu Server and other installations where an X server isn't being started automatically. Try the following to fix it:

Create a directory for a script to initialize your GPUs. I usually use /root/bin. In this directory, create a file called cudainit.sh with the following code in it (this script came from the Nvidia forums).

#!/bin/bash

/sbin/modprobe nvidia

if [ "$?" -eq 0 ]; then

    # Count the number of NVIDIA controllers found.
    N3D=`/usr/bin/lspci | grep -i NVIDIA | grep "3D controller" | wc -l`
    NVGA=`/usr/bin/lspci | grep -i NVIDIA | grep "VGA compatible controller" | wc -l`

    N=`expr $N3D + $NVGA - 1`
    for i in `seq 0 $N`; do
        mknod -m 666 /dev/nvidia$i c 195 $i;
    done    

    mknod -m 666 /dev/nvidiactl c 195 255

else
    exit 1
fi  

Now we need to make this script run automatically at boot. Edit /etc/rc.local to look like the following.

#!/bin/sh -e
#   
# rc.local
#   
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#   
# In order to enable or disable this script just change the execution
# bits.
#   
# By default this script does nothing.

#
# Init CUDA for all users
#   
/root/bin/cudainit.sh

exit 0

Reboot your computer and try to run your CUDA program as a regular user. If I'm right about what the problem is, then it should be fixed.

like image 84
Brendan Wood Avatar answered Oct 18 '22 20:10

Brendan Wood


To work with Ubuntu 14.04 I followed https://devtalk.nvidia.com/default/topic/699610/linux/334-21-driver-returns-999-on-cuinit-cuda-/ to add nvidia-uvm to etc/modules, and to add a line to a custom udev rule. Create /etc/udev/rules.d/70-nvidia-uvm.rules with this line:

KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/bin/mknod -m 666 /dev/nvidia-uvm c $(grep nvidia-uvm /proc/devices | cut -d \  -f 1) 0;'"

I don't understand why sudo modprobe nvidia-uvm works to create a proper /dev/nvidia-uvm (as does sudo cuda_program) but the /etc/modules listing requires the udev rule.

like image 28
Lucas W Avatar answered Oct 18 '22 21:10

Lucas W