我在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
如何使用root权限运行cuda-gdb
?
更多信息: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应用程序。
答案 0 :(得分:3)
谢谢。从它的声音来看,你的问题是所需的设备节点没有被初始化。通常,运行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
注意,您需要在每次启动时重新创建设备节点,因此最好将此脚本(或类似脚本)添加到启动序列中。
@Till:对这些问题的答案抱歉:)。我是SO的新手,没有足够的声誉来创建评论。
答案 1 :(得分:1)
此问题已通过最新的Nvidia驱动程序(304.60)和最新版本的cuda(5.0.35)修复。 cuda-gdb
不需要root权限即可运行。