9

我在 Ubuntu 10.04 上使用 GeForce 8400M GS,并且正在学习 CUDA 编程。我正在编写和运行一些基本程序。我正在使用 cudaMalloc,它一直给我一个错误,直到我以 root 身份运行代码。但是,我只需要以 root 身份运行代码一次。之后,即使我以普通用户身份运行代码,我也不会在 malloc 上收到错误。这是怎么回事?

4

2 回答 2

9

这可能是由于您的 GPU 在启动时未正确初始化。在使用 Ubuntu Server 和其他 X 服务器未自动启动的安装时,我遇到了这个问题。尝试以下方法来修复它:

为脚本创建一个目录以初始化您的 GPU。我通常使用/root/bin. 在此目录中,创建一个文件cudainit.sh,其中包含以下代码(此脚本来自 Nvidia 论坛)。

#!/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  

现在我们需要让这个脚本在启动时自动运行。编辑/etc/rc.local为如下所示。

#!/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

重新启动计算机并尝试以普通用户身份运行 CUDA 程序。如果我对问题的看法是正确的,那么它应该被修复。

于 2012-06-20T17:10:23.713 回答
2

为了使用 Ubuntu 14.04,我按照https://devtalk.nvidia.com/default/topic/699610/linux/334-21-driver-returns-999-on-cuinit-cuda-/添加nvidia-uvmetc/modules,并添加行到自定义 udev 规则。/etc/udev/rules.d/70-nvidia-uvm.rules使用此行创建:

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;'"

我不明白为什么sudo modprobe nvidia-uvm可以创建一个正确的/dev/nvidia-uvm(就像那样sudo cuda_program),但/etc/modules列表需要 udev 规则。

于 2015-03-20T17:01:24.100 回答