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

标签 ubuntu cuda x11 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


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

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)" 


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

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

最佳答案

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

您可以使用VirtualGL and TurboVNC组合访问远程工作站(甚至是无头工作站)以进行图形化桌面访问,还可以访问CUDA和OpenGL加速。以下说明非常特定于特定的计算机配置(例如linux OS等),因此,如果进行更改,它们很可能会中断,并且您必须找出不同之处。对于CentOS 6.x,这应该是一个很好的方法,对于其他方法,它只是一个指南。该配方主要假设仅添加了一个Tesla / CUDA GPU。如果要配置多个GPU,则应该可以,但是只有一个用于OpenGL加速-在xorg.conf中只需配置一个。


可以使用没有显示输出的Tesla卡完成此设置(例如,K40c。K20变体是一种特殊情况,但是请参阅下面的*)。在这种情况下,假定您有另一个显示卡用于初始远程工作站设置步骤。该另一张显示卡可以是任何卡,并且在安装后可以将机器转换为“无头”使用。如果您使用其他显示GPU进行设置,则最初可以将Tesla或CUDA GPU置于系统之外。
安装您的Linux操作系统。我为此测试使用了CentOS 6.2。如果您使用的是CentOS / RHEL 6.x操作系统,那么这里描述的内容应该可以为您工作。如果您使用其他操作系统,则可能有所不同。如果是这样,这些说明仅是指导,而不是配方。在安装CentOS 6.2的过程中,选择“软件开发工作站”选项,以获取我们需要的大多数图形和开发位。在安装过程中,系统将提示您创建普通用户名(root用户除外)。我们将其称为myuser
禁用Nouveau。在CentOS 6.x上,这些步骤将以root身份完成:

echo -e "blacklist nouveau\noptions nouveau modeset=0"  > /etc/modprobe.d/disable-nouveau.conf
dracut --force

关闭电源,然后安装要用于CUDA和/或OpenGL加速的Tesla或其他CUDA GPU。再次打开机器电源。希望linux显示器仍可以与第3步中使用的显示器相同。如果您使用的是Tesla(即非显示器)卡,那么应该没有任何问题,但是如果您使用的是其他CUDA显示器,则应该没有问题。具有功能的GPU(GeForce / Quadro),此时X显示屏可能会移动到您刚安装的GPU。
安装CUDA 7。我使用了runfile安装程序方法,并为所有问题(包括OpenGL库的安装)选择了是,并接受所有默认路径。如果使用其他CUDA版本或其他安装方法,则结果可能会有所不同。
安装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


我认为这些版本没有什么特别之处,但是如果您使用其他版本,则结果可能会有所不同。
以root身份运行nvidia-xconfig(从终端会话)以建立初始的/etc/X11/xorg.conf文件,然后修改“设备”部分以添加如下一行:

BusID    "PCI:1:0:0"


PCI地址与您的GPU匹配的地方(用lspcinvidia-smi -a确认)对于无头操作,您可以选择将这样的行添加到“屏幕”部分,但是我相信没有必要(即使对于无头)操作):

Option         "UseDisplayDevice" "none"


完整的示例xorg.conf出现在此答案的末尾。
在此行之后的myuser中,为~/.vnc/xstartup.turbovnc

unset SESSION_MANAGER


添加以下行:

unset DBUS_SESSION_BUS_ADDRESS

作为myuser,使用gnome桌面实用程序(系统...首选项...启动应用程序),如下所示添加启动应用程序

/opt/TurboVNC/bin/vncserver :5 -depth 24


:5在这里有些随意,可以根据需要使用其他数字,例如:2,但不要使用:0。其余部分假定您在此处选择了:5。您还将希望在终端会话中也运行此行(仅一次,再次作为myuser),以便设置/配置vncserver以供使用。首次运行时,它可能会提示您输入密码。记住此密码-以后需要它才能用于客户端访问。
对于无头/无人值守使用,有两种可能的选择。


您可以为myuser创建自动登录。以root用户身份,编辑/etc/gdm/custom.conf以创建/添加:

[daemon]
AutomaticLoginEnable=true
AutomaticLogin=myuser



我承认有些人可能会将自动登录视为安全隐患。如果是这种情况,则应使用下面的替代(“首选”)方法:


停止X服务器
以root身份运行vglserver_config
选择选项1
对所有3个问题回答n(这也可以,但是这里也存在安全问题。您可能希望consult the documentation,并设法管理必要的用户组,并尝试对所有3个问题使用除n以外的其他选择)
选择X退出
重新启动X服务器


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

/opt/TurboVNC/bin/vncserver :5 -display 24


或者,您可以探索在计算机启动时自动运行应用程序的各种方法。这里有很多可能的方法,最好是只进行与您的操作系统相关的google搜索。
如果尚未这样做,则可能需要构建CUDA示例。在上面的步骤5中链接的入门指南文档中介绍了该方法。您可能需要确保为某些CUDA图形示例(例如simpleGL)安装了合适的glut提供程序,例如freeglut。
在关闭电源之前,您可能还需要修改远程工作站防火墙。出于我的目的,我只是禁用了它(系统...管理...防火墙...禁用)。 TurboVNC使用特定的端口,这些端口默认情况下会被防火墙阻止。如果您希望使用防火墙但打开这些端口,则应该可以,但不在本指南的讨论范围之内。


您的远程工作站现已配置。如果进行了上述所有更改,则可以切换为“无头”操作,并且如果添加了xorg no display选项,则实际上在下一次重新引导时可以切换为“无头”。重新启动之前,您可能需要记下远程工作站的IP地址。如果您要“无头”,则使用静态IP对其进行配置可能会很方便。假设您观察到远程工作站的IP地址为192.168.1.104。现在是时候重新启动远程工作站。

在客户端计算机上,应安装适合您的OS的TurboVNC客户端。运行TurboVNC客户端“ Viewer”应用程序,并提供由:5附加的IP作为连接到的计算机:

192.168.1.104:5


连接后,将提示您输入在上面的步骤9中提供的密码。此时,应在客户端计算机上打开与myuser关联的图形桌面。该图形桌面尚没有与之关联的完整3D图形加速。为了将GPU用于OpenGL(和CUDA / OpenGL互操作),必须运行以vglrun开头的此类应用程序,如下所示:

vglrun -d :0 glxgears


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

vglrun -d :0 /usr/local/cuda/samples/bin/x86_64/linux/release/simpleGL


在以上两个示例中,如果已在步骤10中使用vglserver_config配置了vglserver,则应该能够从vglrun命令中省略-d :0开关:

vglrun glxgears


仅供参考(仅-您极有可能无法逐字使用此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


故障排除:

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

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

作为其他参考,此nvidia whitepaper将很有用。

关于ubuntu - 如何从远程计算机运行CUDA/OpenGL互操作(粒子)示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30081441/

相关文章:

内核中的 CUDA 流 ID

linux - Ubuntu 11.10-如何在不使用X的情况下进入控制台

c++ - XShm 完成事件未设置显示文件描述符

mysql - SQL 客户端抛出错误 1045 但我可以通过命令行进入?

ubuntu - 安装了 Cuda、CuDNN 但 Tensorflow 无法使用 GPU

python - pyenv:构建失败(Ubuntu 15.04 使用 python-build 20160509)

c++ - NSight 分析器使应用程序崩溃

ubuntu - 缓慢的 Ubuntu SSH 登录

cuda - cuda 的 __shared__ 变量不允许初始化程序

c - X11透明窗口: click-through only where alpha = 0