首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cuda-gdb是否需要root权限?

cuda-gdb是否需要root权限?
EN

Stack Overflow用户
提问于 2012-09-08 01:33:29
回答 2查看 1.8K关注 0票数 2

我正在使用cuda-sdkcuda-toolkit包在Arch Linux上进行GPGPU开发。我尝试以普通用户的身份在一个简单的程序上运行cuda-gdb,结果是:

代码语言:javascript
复制
$ 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)

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

代码语言:javascript
复制
# 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为:

代码语言:javascript
复制
// 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

代码语言:javascript
复制
$ nvcc -g -G -gencode arch=compute_20,code=sm_20 driver.cu -o driver

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

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

代码语言:javascript
复制
$ 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应用程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-31 02:19:19

此问题已在最新的Nvidia驱动程序(304.60)和最新版本的cuda (5.0.35)中修复。cuda-gdb不需要超级用户权限即可运行。

票数 1
EN

Stack Overflow用户

发布于 2012-09-11 14:03:33

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

代码语言:javascript
复制
#!/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

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

@Till :关于问题的道歉作为答案:)。我是个新手,没有足够的名气来写评论。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12322815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档