小编Dan*_*ele的帖子

在 docker 中使用 OpenGL 和 nvidia-docker2

我正在尝试在 Ubuntu 16.04 容器中运行 OpenGL 应用程序 ( Gazebo ),并且我希望能够在可用时利用 nvidia 图形加速。我试图弄清楚推荐的、官方支持的(希望由 nvidia 支持)实现这一目标的方法是什么。

我的要求:

  1. 创建图像非常耗时,所以我想为所有类型的图形(nvidia、mesa,即其他所有内容)提供一个图像,或者如果分开,它们应该“从”一个具有批量的公共基础图像构建的内容。
  2. nvidia 容器应该在不同的系统上工作,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
  3. 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如,如果这只能在 18.04 上完成,我也会感兴趣。

到目前为止我尝试过的:

  • 只需为 nvidia 和其他所有内容构建单独的图像,使用FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04. 这很有效,但需要构建两个映像,这需要两倍的时间和两倍的磁盘空间。 打破要求 1。
  • 首先从 构建“普通”(台面/英特尔)映像ubuntu:16.04,在那里完成所有耗时的工作,然后将其用作另一个映像的基础,其中从官方“运行文件”手动安装 NVIDIA 驱动程序。如果驱动程序与安装在主机上的驱动程序完全匹配,则此方法有效,但如果主机具有不同(例如较旧)版本,则无效。打破要求 2。
  • 什么都不做,只需使用--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=all. 如果我这样做,会nvidia-smi看到卡,但 OpenGL(例如glxinfo)仍然尝试加载swrast驱动程序,这不起作用。

我在野外看到的大多数示例都使用nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04基础,并且在我的一生中,我找不到该图像中如何安装 nvidia 驱动程序(如果有的话)。我还在某处读到过,使用 nvidia 容器运行时(即nvidia-docker2我正在使用的),您不需要安装驱动程序,但情况似乎并非如此,至少对于 OpenGL 而言并非如此。

那么,有没有办法为 nvidia 和非 nvidia 创建满足我所有要求的容器映像,或者我只是想要太多?

opengl ubuntu nvidia docker

5
推荐指数
1
解决办法
1868
查看次数

加载核心文件时,gdb 不会加载共享库符号,甚至不会加载 libc.so (musl)

我正在尝试调试在具有 MIPS cpu 的板上远程运行的程序,使用 musl 作为其 libc。如果我在板上启动 gdbserver,设置 sysroot viaset sysroot /path/to/sysroot并从 gdb 进行实时连接,我会得到有意义的堆栈跟踪(由于 musl 缺乏 MIPS 上的 CFI 指令,而我必须添加它们,因此需要花费数小时的时间,但这是一个单独的问题),我可以看到 gdb 从libc.sosysroot 加载符号。

另一方面,如果我让该程序崩溃并生成核心转储(我曾经kill -6 <pid>强制使用一个核心转储进行测试),gdb 将从二进制文件中加载符号,但不会加载其任何共享库,甚至不会加载libc.so. 虽然其他共享库很好但不是必需的,如果没有来自 libc.so 的调试信息,gdb 无法解析堆栈跟踪,并且它们看起来都像垃圾。

成功的实时 gdb 会话

$ mipsel-poky-linux-gdb -iex "set sysroot /path/to/sysroot" /path/to/testprog
GNU gdb (GDB) 8.2.1
Copyright (C) 2018 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 …
Run Code Online (Sandbox Code Playgroud)

linux debugging gdb mips musl

5
推荐指数
1
解决办法
4050
查看次数

scons:更改单个源文件的编译标志

我有一个相当复杂的scons系统,有几个子目录,有许多库和可执行文件.目前,每个SConscript都有自己的克隆环境,因此我可以在每个SConscript的基础上轻松更改CFLAGS(或任何其他可用的),但我想更改每个目标,甚至是每个目标文件.目标.

我创建了一个简单的例子SConscript和SConstruct来解释这个问题,如下所示.

SConstruct:

env = Environment()
env['CFLAGS'] = '-O2'
env.SConscript('SConscript', 'env')
Run Code Online (Sandbox Code Playgroud)

SConscript:

Import('env')
env=env.Clone()
env.Program('foo', ['foo.c', 'bar.c'])
Run Code Online (Sandbox Code Playgroud)

如果我运行scons,foo.c和bar.c都会使用-O2标志进行编译.我可以通过env['CFLAGS'] = '...'在SConscript中添加来轻松地更改SConscript范围内的标志,但是让我们说我想编译foo.c -O2,但是bar.c完全调试,-O0 -g.我该怎么做(以最简单的方式)?

该示例使用gcc,但我想要可以与任何编译器一起使用的东西.

经常发生这种情况与在没有优化将导致不可接受的性能编译所有性能敏感的项目,但有一个需要调试一个单一的文件(或其中的一个子集).

scons

4
推荐指数
1
解决办法
4772
查看次数

标签 统计

debugging ×1

docker ×1

gdb ×1

linux ×1

mips ×1

musl ×1

nvidia ×1

opengl ×1

scons ×1

ubuntu ×1