2

cuda-sdkおよび cuda-toolkitパッケージを使用して Arch Linux で GPGPU 開発を行っています。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-gdbroot として実行すると、正常に動作します。

# 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-gdbroot 権限なしで実行するにはどうすればよいですか?

いくつかの詳細情報: からの出力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 アプリケーションを実行しています。

4

2 に答える 2

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を初めて使用し、コメントを作成するのに十分な評判がありません。

于 2012-09-11T06:03:32.747 に答える
1

この問題は、最新の Nvidia ドライバー (304.60) と最新バージョンの cuda (5.0.35) で修正されています。 cuda-gdb実行にルート権限は必要ありません。

于 2012-10-30T18:19:19.167 に答える