Opencl 应用程序在用户物理(而不是远程)登录到机器之前无法识别 GPU

har*_*jay 5 ssh ati opencl lightdm drivers

我在运行 Ubuntu 13.10 的机器上的 2x AMD Radeon HD 7870 上运行了一些 opencl 应用程序。

我打开机器电源,lightdm 有登录提示。因为每次我重新启动它时,我都无法亲自登录到机器。我想解决为什么 Opencl 在机器上重启后没有检测到 GPU。

如果我 ssh 进入机器并启动 opencl 作业,则无需登录 lightdm 。Opencl 不会“看到”GPU。

只有当我通过实际存在并登录到 lightdm 的方式登录到机器时,远程外壳才会“看到”GPU。

我不太了解 openCL 以提供更多信息,但这似乎是关于 ubuntu 如何初始化的。登录到 lightdm 控制台对图形驱动程序的状态有什么影响。

有什么方法可以“加载”驱动程序让 OpenCL 看到它。

奇怪的是,当 Opencl 无法“看到”GPU 时,lsmod 显示“fglrx”已加载并正在使用中。

#

未登录 lightdm 和 ssh 会话报告的状态

#
   hari@hjubuntu:~$ ~/oepncl-program

    Available device list:
    Type: CPU, 'Intel(R) Core(TM)2 Quad  CPU   Q9450  @ 2.66GHz'


hari@hjubuntu:~$ lsmod
    Module                  Size  Used by
    pci_stub               12622  1 
    vboxpci                23194  0 
    vboxnetadp             25670  0 
    vboxnetflt             27613  0 
    vboxdrv               320455  3 vboxnetadp,vboxnetflt,vboxpci
    cuse                   13274  3 
    dm_crypt               22832  0 
    kvm_intel             138567  0 
    kvm                   431754  1 kvm_intel
    gpio_ich               13476  0 
    ppdev                  17671  0 
    snd_usb_audio         149162  2 
    bnep                   19704  2 
    snd_usbmidi_lib        25070  1 snd_usb_audio
    rfcomm                 69130  0 
    bluetooth             372041  10 bnep,rfcomm
    snd_hda_codec_hdmi     41154  2 
    microcode              23656  0 
    psmouse                97655  0 
    snd_hda_codec_realtek    56475  1 
    serio_raw              13413  0 
    snd_seq_midi           13324  0 
    snd_hda_intel          52267  7 
    snd_seq_midi_event     14899  1 snd_seq_midi
    snd_hda_codec         188738  3 snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_intel
    snd_rawmidi            30095  2 snd_usbmidi_lib,snd_seq_midi
    snd_hwdep              13602  2 snd_usb_audio,snd_hda_codec
    lpc_ich                21080  0 
    snd_pcm               102033  4 snd_usb_audio,snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel
    snd_seq                61560  2 snd_seq_midi_event,snd_seq_midi
    snd_page_alloc         18710  2 snd_pcm,snd_hda_intel
    snd_seq_device         14497  3 snd_seq,snd_rawmidi,snd_seq_midi
    snd_timer              29433  2 snd_pcm,snd_seq
    fglrx                8815330  48 
    snd                    69141  31 snd_hda_codec_realtek,snd_usb_audio,snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_pcm,snd_seq,snd_rawmidi,snd_usbmidi_lib,snd_hda_codec,snd_hda_intel,snd_seq_device,snd_seq_midi
    it87                   43113  0 
    hwmon_vid              12783  1 it87
    parport_pc             32701  1 
    coretemp               13435  0 
    x38_edac               12898  0 
    soundcore              12680  1 snd
    lp                     17759  0 
    parport                42299  3 lp,ppdev,parport_pc
    binfmt_misc            17468  1 
    mac_hid                13205  0 
    amd_iommu_v2           19054  1 fglrx
    edac_core              62342  1 x38_edac
    vesafb                 13828  1 
    pata_acpi              13038  0 
    hid_generic            12548  0 
    usbhid                 53014  0 
    hid                   101762  2 hid_generic,usbhid
    firewire_ohci          40327  0 
    firewire_core          64534  1 firewire_ohci
    crc_itu_t              12707  1 firewire_core
    r8169                  67581  0 
    mii                    13934  1 r8169
    pata_jmicron           12758  0 
    ahci                   25819  0 
    libahci                32009  1 ahci
    floppy                 69370  0 
Run Code Online (Sandbox Code Playgroud)

用户登录后,我运行相同的程序。

#

登录lightdm并启动桌面环境后的状态

#
hari@hjubuntu:~$ ~/opencl-program
Available device list:
Type: CPU, 'Intel(R) Core(TM)2 Quad  CPU   Q9450  @ 2.66GHz'
Type: GPU, 'Pitcairn'
Type: ACCELERATOR, 'Pitcairn'
Run Code Online (Sandbox Code Playgroud)

现在如果我对 lsmod 做一个差异,我得到的是

hari@hjubuntu:~$ diff before_login after_login | grep fglrx
<     fglrx                8815330  48 
<     amd_iommu_v2           19054  1 fglrx
> fglrx                8815330  44 
> amd_iommu_v2           19054  1 fglrx
Run Code Online (Sandbox Code Playgroud)

所以登录导致 fglrx 驱动程序被“44”使用。我如何模仿这个,所以当有人远程重启这台机器时我必须登录?。

编辑:我正在尝试实现下面的脚本并且总是得到一个

"hari@hjubuntu:~$ xauth extract "$DISPLAY"
xauth: (argv):1:  bad "extract" command line"
Run Code Online (Sandbox Code Playgroud)

$DISPLAY 环境标签为空

hari@hjubuntu:~$ echo $DISPLAY
Run Code Online (Sandbox Code Playgroud)

xauth 列表给出

hjubuntu/unix:1  MIT-MAGIC-COOKIE-1  8562e9f6ac976f310d1425aa11e74184
hjubuntu:0  MIT-MAGIC-COOKIE-1  80f5f4c28e7e2d0fc9444b1862f5cbcb
hjubuntu:0  MIT-MAGIC-COOKIE-1  80f5f4c28e7e2d0fc9444b1862f5cbcb
hjubuntu/unix:13  MIT-MAGIC-COOKIE-1  142c11b5689f4bd2776e860b9d8719dd
hjubuntu/unix:14  MIT-MAGIC-COOKIE-1  08353f652f21b479a6da3a60282bce31
hjubuntu/unix:15  MIT-MAGIC-COOKIE-1  655d074dfb395f536283e70a9494428c
hjubuntu/unix:12  MIT-MAGIC-COOKIE-1  91387509c2dff960e295fdd0eb0ada52
hjubuntu/unix:11  MIT-MAGIC-COOKIE-1  914c7988660149b90eed958066ed2e71
hjubuntu/unix:10  MIT-MAGIC-COOKIE-1  0ab65dbaf838a08bd8c9141fb5da7c35
Run Code Online (Sandbox Code Playgroud)

想知道我应该如何进行。

Nic*_*tch 4

通常,硬件的某些功能在需要时才会初始化 - 例如额外的显示端口等,因此在这种情况下,可能需要实际运行使用卡上相关硬件的东西来打开它。

最便宜/最简单的方法是打开自动登录功能(设置>用户帐户)。使用哪个帐户执行此操作并不重要,因此如果您担心安全性,甚至可以使用访客帐户。

如果这还不够(可能存在权限问题),您可以共享 xauthority。只需将类似的内容添加到 lightdm 脚本的末尾:

xauth extract /tmp/auth-file "$DISPLAY"
chmod 660 /tmp/auth-file
chgrp users /tmp/auth-file
cat > /tmp/gpuenable <<EOF
export COMPUTE=$DISPLAY
unset DISPLAY
export XAUTHORITY=/tmp/auth-file
EOF
Run Code Online (Sandbox Code Playgroud)

那么当您远程登录时,您只需/tmp/gpuenable在任何 OpenCL 代码之前运行即可。将组名称“users”更改为您想要访问的任何组。

PS 这不是 Ubuntu 特定的,或者实际上,甚至不是 Linux 特定的,只是大多数其他操作系统都一直在运行显示。