2011年9月19日 星期一

在 Linux 下執行 CUDA 時出現 /dev/nvidiactl 無法開啟之問題排除

平時執行 CUDA 程式時,都是以使用者的帳號進行編譯執行,然而遭遇某次異常停電後,安裝 GPGPU 的 Linux 主機在執行 CUDA 程式時,出現下列警告訊息:
  • could not open the device file /dev/nvidiactl (No such file or directory)
但是以 root 的身份去查詢,卻又發現 nvidiactl 確實存在,因此推測系統可能在異常關閉後, nvidiactl 的權限遭到更改,又或者是沒設定開機後CUDA自動啟動,於是以下將介紹該障礙排除的方法:
  1. 先切換成系統管理員(root)的帳號。
  2. 新增 sh 檔,並將下列程式碼貼上並存檔:
    • #!/bin/bash
      #
      # Startup/shutdown script for nVidia CUDA
      #
      # chkconfig: 345 80 20
      # description: Startup/shutdown script for nVidia CUDA

      # Source function library.
      . /etc/init.d/functions

      DRIVER=nvidia
      RETVAL=0

      # Create /dev nodes for nvidia devices
      function createnodes() {
         # Count the number of NVIDIA controllers found.
         N3D=`/sbin/lspci | grep -i NVIDIA | grep "3D controller" | wc -l`
         NVGA=`/sbin/lspci | grep -i NVIDIA | 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
             RETVAL=$?
             [ "$RETVAL" = 0 ] || exit $RETVAL
         done

         mknod -m 666 /dev/nvidiactl c 195 255
         RETVAL=$?
         [ "$RETVAL" = 0 ] || exit $RETVAL
      }

      # Remove /dev nodes for nvidia devices
      function removenodes() {
         rm -f /dev/nvidia*
      }

      # Start daemon
      function start() {
         echo -n $"Loading $DRIVER kernel module: "
         modprobe $DRIVER && success || failure
         RETVAL=$?
         echo
         [ "$RETVAL" = 0 ] || exit $RETVAL

         echo -n $"Initializing CUDA /dev entries: "
         createnodes && success || failure
         RETVAL=$?
         echo
         [ "$RETVAL" = 0 ] || exit $RETVAL
      }

      # Stop daemon
      function stop() {
         echo -n $"Unloading $DRIVER kernel module: "
         rmmod -f $DRIVER && success || failure
         RETVAL=$?
         echo
         [ "$RETVAL" = 0 ] || exit $RETVAL

         echo -n $"Removing CUDA /dev entries: "
         removenodes && success || failure
         RETVAL=$?
         echo
         [ "$RETVAL" = 0 ] || exit $RETVAL
      }

      # See how we were called
      case "$1" in
         start)
             start
            ;;
         stop)
             stop
            ;;
         restart)
             stop
             start
            ;;
         *)
             echo $"Usage: $0 {start|stop|restart}"
             RETVAL=1
      esac
      exit $RETVAL
  3. 執行 sh 檔
    • sh 檔名.sh restart
  4. 在確定 sh 檔正常運作後,執行 CUDA 程式測試狀況是否排除。

參考資料:

沒有留言:

張貼留言