Требуется ли для cuda-gdb root-права?
Я занимаюсь разработкой GPGPU на Arch Linux с cuda-sdk
а такжеcuda-toolkit
пакеты. Мои попытки убежать 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)
Если я бегу cuda-gdb
как root, он ведет себя нормально:
# 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, и я запускаю приложения CUDA на Tesla.
2 ответа
Эта проблема была исправлена с помощью последней версии драйвера Nvidia (304.60) и последней версии cuda (5.0.35). cuda-gdb
не требует прав root для запуска.
Спасибо. Судя по всему, ваша проблема в том, что необходимые узлы устройства не инициализируются. Обычно запуск X создает узлы устройств, которые необходимы для программного стека CUDA для связи с оборудованием. Когда X не работает, как в данном случае, запуск от имени root создает узлы. Обычный пользователь не может создавать узлы из-за отсутствия разрешений. Рекомендуемый подход при запуске системы Linux без X состоит в том, чтобы запустить следующий сценарий от имени пользователя 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, и у меня недостаточно репутации для создания комментариев.