cuda - cuda-gdb需要root权限吗?

标签 cuda archlinux cuda-gdb

我正在 Arch Linux 上使用 cuda-sdk 进行 GPGPU 开发,并且 cuda-toolkit 软件包。我尝试以普通用户身份在 a 上运行 cuda-gdb 简单的程序结果:

$ cuda-gdb ./driver
NVIDIA (R) CUDA Debugger
4.2 release
Portions Copyright (C) 2007-2012 NVIDIA Corporation
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/nwh/Dropbox/projects/G4CU/driver...done.
(cuda-gdb) run
Starting program: /home/nwh/Dropbox/projects/G4CU/driver 
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
fatal:  The CUDA driver initialization failed. (error code = 1)

如果我以 root 身份运行 cuda-gdb,它的行为正常:

# cuda-gdb ./driver
NVIDIA (R) CUDA Debugger
4.2 release
Portions Copyright (C) 2007-2012 NVIDIA Corporation
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/nwh/Dropbox/work/2012-09-06-cuda_gdb/driver...done.
(cuda-gdb) run
Starting program: /home/nwh/Dropbox/work/2012-09-06-cuda_gdb/driver 
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
[New Thread 0x7ffff5ba8700 (LWP 11386)]
[Context Create of context 0x6e8a30 on Device 0]
[Launch of CUDA Kernel 0 (thrust::detail::backend::cuda::detail::launch_closure_by_value<thrust::detail::backend::cuda::for_each_n_closure<thrust::device_ptr<unsigned long long>, unsigned int, thrust::detail::device_generate_functor<thrust::detail::fill_functor<unsigned long long> > > ><<<(1,1,1),(704,1,1)>>>) on Device 0]
[Launch of CUDA Kernel 1 (set_vector<<<(1,1,1),(10,1,1)>>>) on Device 0]
vd[0] = 0
vd[1] = 1
vd[2] = 2
vd[3] = 3
vd[4] = 4
vd[5] = 5
vd[6] = 6
vd[7] = 7
vd[8] = 8
vd[9] = 9
[Thread 0x7ffff5ba8700 (LWP 11386) exited]

Program exited normally.
[Termination of CUDA Kernel 1 (set_vector<<<(1,1,1),(10,1,1)>>>) on Device 0]
[Termination of CUDA Kernel 0 (thrust::detail::backend::cuda::detail::launch_closure_by_value<thrust::detail::backend::cuda::for_each_n_closure<thrust::device_ptr<unsigned long long>, unsigned int, thrust::detail::device_generate_functor<thrust::detail::fill_functor<unsigned long long> > > ><<<(1,1,1),(704,1,1)>>>) on Device 0]

测试程序driver.cu是:

// needed for nvcc with gcc 4.7 and iostream
#undef _GLIBCXX_ATOMIC_BUILTINS
#undef _GLIBCXX_USE_INT128

#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>

__global__
void set_vector(int *a)
{
  // get thread id
  int id = threadIdx.x + blockIdx.x * blockDim.x;
  a[id] = id;
  __syncthreads();
}

int main(void)
{
  // settings
  int len = 10; int trd = 10;

  // allocate vectors
  thrust::device_vector<int> vd(len);

  // get the raw pointer
  int *a = thrust::raw_pointer_cast(vd.data());

  // call the kernel
  set_vector<<<1,trd>>>(a);

  // print vector
  for (int i=0; i<len; i++)
    std::cout << "vd[" << i << "] = " << vd[i] << std::endl;

  return 0;
}

driver.c 使用以下命令编译:

$ nvcc -g -G -gencode arch=compute_20,code=sm_20 driver.cu -o driver

如何让 cuda-gdb 在没有 root 权限的情况下运行?

更多信息:nvidia-smi 的输出为:

$ nvidia-smi
Mon Sep 10 07:16:32 2012       
+------------------------------------------------------+                       
| NVIDIA-SMI 4.304.43   Driver Version: 304.43         |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name                     | Bus-Id        Disp.  | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap| Memory-Usage         | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro FX 1700           | 0000:01:00.0     N/A |                  N/A |
| 60%   52C  N/A     N/A /  N/A |   4%   20MB /  511MB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla C2070              | 0000:02:00.0     Off |                    0 |
| 30%   82C    P8    N/A /  N/A |   0%   11MB / 5375MB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Compute processes:                                               GPU Memory |
|  GPU       PID  Process name                                     Usage      |
|=============================================================================|
|    0            Not Supported                                               |
+-----------------------------------------------------------------------------+

显示器连接到 Quadro,我在 Tesla 上运行 CUDA 应用程序。

最佳答案

谢谢。从声音来看,您的问题是所需的设备节点未初始化。通常,运行 X 将创建 CUDA 软件堆栈与硬件通信所需的设备节点。当 X 没有运行时,就像这里的情况一样,以 root 身份运行会创建节点。由于缺乏权限,普通用户无法创建节点。在没有 X 的情况下运行 Linux 系统时,推荐的方法是以 root 身份运行以下脚本(来自 http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_Getting_Started_Linux.pdf 的入门指南)

#!/bin/bash
/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | 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

请注意,您需要在每次启动时重新创 build 备节点,因此最好将此脚本(或类似脚本)添加到您的启动序列中。

@Till:对这些问题作为答案表示歉意:)。我是 SO 新手,没有足够的声誉来创建评论。

关于cuda - cuda-gdb需要root权限吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322815/

相关文章:

while-loop - 在迭代循环中避免 CudaMemcpy

unix - i3 不会加载布局(解析错误 : client cancelled parse via callback return value)

flutter - 如何在 Arch Linux 上为 Flutter 2 Web 设置 Google Chrome 的环境变量

c++ - CUDA 直方图 reduce_by_key 失败

CUDA:atomicAdd 花费太多时间,序列化线程

c++ - CUDA-GDB 在 C/C++ 中查看变量

cuda-gdb 在四个可用的支持 CUDA 的设备中只看到一个能力最低的设备

cuda - CUDA 桌面版和笔记本版有什么区别?

linux - 为什么 npm 在我的主目录中创建一个名为 '~' 的文件夹?