如何从远程计算机运行CUDA/OpenGL互操作(粒子)示例

w0r*_*t3r 3 x11 ubuntu cuda freeglut nsight

我试图从主机ubuntu机器上运行远程Ubuntu机器上的CUDA粒子样本.我遵循了这个教程:http: //devblogs.nvidia.com/parallelforall/remote-application-development-nvidia-nsight-eclipse-edition/它在我的主机上运行,​​但不在我的远程机器上运行.

我在Nsight中得到以下输出:

CUDA Particles Simulation Starting...

grid: 64 x 64 x 64 = 262144 cells
particles: 16384
No protocol specified
freeglut (/users/path/particles/Debug/particles): failed to open display ':0'
logout
Run Code Online (Sandbox Code Playgroud)

如果我从终端运行程序,我得到:

CUDA Particles Simulation Starting...

grid: 64 x 64 x 64 = 262144 cells
particles: 16384
CUDA error at ../src/particleSystem_cuda.cu:85  code=79(cudaErrorInvalidGraphicsContext)  "cudaGraphicsGLRegisterBuffer(cuda_vbo_resource, vbo, cudaGraphicsMapFlagsNone)" 
Run Code Online (Sandbox Code Playgroud)

是否可以在我的主机上显示粒子模拟,而计算是在远程系统上进行的?

它是通过X11Forwarding实现的,还是完全不同的错误?

Rob*_*lla 13

我将提供一个冗长的答案,因为我刚刚完成了这个.但是,在继续这条道路之前,我建议您尝试像NoMachine NX这样的解决方案,它应该已经内置了一些此功能.它可能满足您的需求.

您可以访问远程工作站,甚至是无头工作站,进行图形桌面访问,还可以使用VirtualGL和TurboVNC的组合访问CUDA和OpenGL加速.以下说明对于特定的机器配置(例如Linux操作系统等)非常具体,因此如果您进行更改,它们可能会中断,您将不得不弄清楚有什么不同.对于CentOS 6.x,这应该是一个非常好的配方,对于其他方法,它只是一个指南.这个配方主要假设只添加了一个Tesla/CUDA GPU.如果您要配置多个GPU,则应该可以,但只有一个用于OpenGL加速 - 只需要配置一个xorg.conf.

  1. 这种设置可以使用没有显示输出的Tesla卡完成(例如K40c.但K20型号是特殊情况,但请参阅下面的注释*).在这种情况下,它假定您有另一个显示卡用于初始远程工作站设置步骤.这个其他显示卡可以是任何卡,并且设置后可以将机器转换为"无头"使用.如果您使用不同的显示GPU进行设置,您最初可以将Tesla或CUDA GPU从系统中取出.

  2. 安装Linux操作系统.我使用CentOS 6.2进行此测试.如果您使用的是CentOS/RHEL 6.x操作系统,那么事情应该对您有用,就像这里描述的那样.如果您使用其他操作系统,则任何内容都可能不同.如果是这样,这些说明只是一个指南,而不是食谱.在安装CentOS 6.2期间,选择"软件开发工作站"选项,以获得我们需要的大部分图形和开发位.在安装过程中,系统会提示您创建普通用户名(除了root用户).我们称之为myuser.

  3. 禁用Nouveau.在CentOS 6.x上,这些步骤将以root身份执行:

    echo -e "blacklist nouveau\noptions nouveau modeset=0"  > /etc/modprobe.d/disable-nouveau.conf
    dracut --force
    
    Run Code Online (Sandbox Code Playgroud)
  4. 关闭电源并安装要用于CUDA和/或OpenGL加速的Tesla或其他CUDA GPU.再次打开机器电源.希望linux显示器仍然出现在您在步骤3中使用的同一显示器上.如果您使用特斯拉(即非显示器)卡,但如果您正在使用其他CUDA显示器,则应该没有任何问题有能力的GPU(GeForce/Quadro),X显示器可能会在此时移动到您刚安装的GPU.

  5. 安装CUDA 7.我使用了runfile安装程序方法,并为所有问题选择了yes (包括安装OpenGL库)并接受所有默认路径.如果您使用其他一些CUDA版本或其他一些安装方法,您的结果可能会有所不同.

  6. 安装VirtualGL和TurboVNC:

    wget http://sourceforge.net/projects/virtualgl/files/2.3.3/VirtualGL-2.3.3.x86_64.rpm/download
    sudo rpm -i VirtualGL-2.3.3.x86_64.rpm
    wget http://sourceforge.net/projects/turbovnc/files/1.2.1/turbovnc-1.2.1.x86_64.rpm/download
    sudo rpm -i turbovnc-1.2.1.x86_64.rpm
    
    Run Code Online (Sandbox Code Playgroud)

    我不认为这些版本有什么特别之处,但如果你使用不同的版本,你的结果可能会有所不同.

  7. 以root身份运行nvidia-xconfig(从终端会话)建立初始文件,然后修改"设备"部分以添加如下所示的行:/etc/X11/xorg.conf

    BusID    "PCI:1:0:0"
    
    Run Code Online (Sandbox Code Playgroud)

    PCI地址与您的GPU匹配(用lspci或确认nvidia-smi -a)对于无头操作,您可以选择在"屏幕"部分添加这样的行,但我认为没有必要(即使是无头操作):

    Option         "UseDisplayDevice" "none"
    
    Run Code Online (Sandbox Code Playgroud)

    xorg.conf这个答案的最后会出现一个完整的样本.

  8. as myuser,in ~/.vnc/xstartup.turbovnc,this line:

    unset SESSION_MANAGER
    
    Run Code Online (Sandbox Code Playgroud)

    添加以下行:

    unset DBUS_SESSION_BUS_ADDRESS
    
    Run Code Online (Sandbox Code Playgroud)
  9. as myuser,使用gnome桌面实用程序(System ... Preferences ... Startup Applications)添加如下的启动应用程序

    /opt/TurboVNC/bin/vncserver :5 -depth 24
    
    Run Code Online (Sandbox Code Playgroud)

    :5这里是有点武断,你可以使用其他数字一样:2,如果你愿意的话,但不要使用:0.其余部分假定您已:5在此处选择.您还希望myuser从终端会话中运行此行(仅一次,再次作为),以便设置/配置vncserver以供使用.第一次运行它时,它可能会提示您输入密码.记住这个密码 - 您将需要它以便以后访问客户端.

  10. 对于无头/无人值守使用,有两种可能的选择.

    我承认有些人可能会将自动登录视为安全风险.如果是这种情况,您应该使用下面的备用("首选")方法:

    • 停止X服务器
    • 以root身份运行 vglserver_config
    • 选择选项1
    • 回答n所有3个问题(这将有效,但是这里也存在安全问题.您可能希望查阅文档,并展示管理必要的用户组并尝试除了n所有3个问题之外的其他选择.)
    • 选择X退出
    • 重启X服务器

    如果没有自动登录,您将需要一种方法来启动vncserver以进行远程访问,因为我们在步骤9中添加的启动应用程序将不会生效.一种方法是在启动后通过SSH连接登录到机器,并myuser启动vncserver:

    /opt/TurboVNC/bin/vncserver :5 -display 24
    
    Run Code Online (Sandbox Code Playgroud)

    或者,您可以探索在机器启动时自动运行应用程序的各种方法.这里有很多可能的方法,如果你只是做一个与你的操作系统相关的谷歌搜索,那就最好了.

  11. 如果您尚未这样做,则可能需要构建CUDA示例.该方法在上面步骤5中链接的入门指南文档中有所介绍.对于某些CUDA图形样本,您可能需要确保安装了合适的过剩提供程序,例如freeglut,例如simpleGL.

  12. 在关闭电源之前,您可能还需要修改远程工作站防火墙.为了我的目的,我只是禁用它(系统...管理......防火墙......禁用).TurboVNC使用默认情况下将被防火墙阻止的特定端口.如果您希望使用防火墙但打开这些端口,它应该是可能的,但不在本配方的范围内.

您的远程工作站现已配置.如果您进行了上述所有更改,则可以切换到"无头"操作,如果添加了xorg no display选项,则实际上可能会在下次重新启动时切换到"无头".在重新启动之前,您可能需要记下远程工作站的IP地址.如果你"无头",用静态IP配置它可能很方便.假设您发现远程工作站的IP地址是192.168.1.104.所以现在是重启远程工作站的时候了.

在客户端计算机上,您应该安装适合您的操作系统的TurboVNC客户端.运行TurboVNC客户端"查看器"应用程序,并提供附加的IP:5作为要连接的机器:

192.168.1.104:5
Run Code Online (Sandbox Code Playgroud)

连接后,系统将提示您输入上面步骤9中提供的密码.此时,与myuser您关联的图形桌面应在您的客户端计算机上打开.此图形桌面尚未具有与之关联的完整3D图形加速.为了使用GPU进行OpenGL(和CUDA/OpenGL互操作),有必要运行这样的应用程序vglrun,如下所示:

vglrun -d :0 glxgears
Run Code Online (Sandbox Code Playgroud)

您在:0此处指定,因为这是与GPU图形加速相关联的实际X显示(对于已登录myuser).如果您构建了CUDA示例,则可以尝试使用CUDA/OpenGL互操作应用程序:

vglrun -d :0 /usr/local/cuda/samples/bin/x86_64/linux/release/simpleGL
Run Code Online (Sandbox Code Playgroud)

在上面的两个示例中,如果您在步骤10中使用vglserver_config配置了vglserver,那么您应该可以省略-d :0vglrun命令中的切换:

vglrun glxgears
Run Code Online (Sandbox Code Playgroud)

出于参考目的( - 您很可能不能逐字使用此xorg文件),这里是完整的xorg.conf(没有任何修改vglserver_config):

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 346.46  (buildmeister@swio-display-x86-rhel47-06)  Tue Feb 17 19:10:20 PST 2015

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
    FontPath        "/usr/share/fonts/default/Type1"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/input/mice"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from data in "/etc/sysconfig/keyboard"
    Identifier     "Keyboard0"
    Driver         "kbd"
    Option         "XkbLayout" "us"
    Option         "XkbModel" "pc105"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    HorizSync       28.0 - 52.0
    VertRefresh     43.0 - 72.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "UseDisplayDevice" "none"
    SubSection     "Display"
        Depth       24
        Modes      "1024x768"
    EndSubSection
EndSection
Run Code Online (Sandbox Code Playgroud)

故障排除:

我不打算回答详细的故障排除问题,因为我无法测试每个配置.但是,如果您的客户端根本无法连接到远程工作站,则可能意味着vncserver未正确启动,或者防火墙阻塞了某些内容.对于其他类型的故障排除,/var/log/Xorg.0.log可能会提供一些线索.使用nvidia-smi以建立您的CUDA驱动是否安装正确.通常,无头操作很难排除故障,因此如果您可以安排具有显示功能的CUDA GPU进行初始设置和测试,则可能更容易.您可以稍后切换到非显示GPU.

注意:*K20m和K20Xm需要使用该nvidia-smi实用程序正确设置图形操作模式.K20c 不能用于此目的,它仅限计算.AFAIK,大多数其他支持NVIDIA CUDA的GPU都可以用于此目的.但是,具有cc2.0之前的计算能力的GPU不能与本文中描述的CUDA 7驱动程序一起使用.

作为额外的参考,这个nvidia白皮书将是有用的.