如何使用 AMDGPU-Pro 在 Docker 容器中运行 OpenCL 程序?

如何使用 AMDGPU-Pro 在 Docker 容器中运行 OpenCL 程序?

我有一个全新的 Ubuntu 16.04 安装,只安装了 AMDGPU-Pro(专有)驱动程序和 docker-engine(来自 apt.dockerproject.org PPA)。

我想在 Docker 容器内运行 OpenCL 程序。我认为:内核是共享的,因此 GPU 模块应该可用于容器,缺少的是访问模块的库。

我设置了一个容器并在其中编译了一个 OpenCL 程序。在其中运行该程序时返回未找到任何设备。因此,我将二进制文件复制到主机,并在那里执行该二进制文件(我的两个 GPU 设备均被检测到)。

我尝试创建一个新容器(来自 Ubuntu:16.04)并从用于编译的容器中复制二进制文件及其所需的所有库,以及/usr/lib/x86_64-linux-gnu/amdgpu-pro来自主机的文件夹。

不幸的是,这也不起作用。我可能错过了什么?

答案1

设法让它工作。摘要:

  • 需要将 /usr/lib/x86_64-linux-gnu/amdgpu-pro 中的库添加到容器中
  • 需要将 /etc/OpenCL 中的配置文件添加到容器中
  • 需要允许容器访问/dev/dri设备

以下是构建 Docker 镜像的示例脚本:https://gist.github.com/anonymous/fea9c0a9e986eeda7cf58e47f47c89f2

下面是使用创建的图像运行容器的示例命令:

docker run -it --device /dev/dri:/dev/dri climage

如果有人遇到类似的问题,我也会列出我如何找到“解决方案”:

  • 在主机中运行测试二进制文件,使用 strace 列出所有系统调用
    • strace ./cltest &> host.strace
  • 在容器中运行测试二进制文件,同时使用 strace 列出所有系统调用
    • docker run --rm --security-opt seccomp:unconfined -v $(pwd):/external climage strace /external/cltest &> ./container.strace
  • 比较两个输出,可以手动比较,也可以使用类似vimdiff
    • vimdiff container.strace host.strace
  • 查看命令结果的不同之处,在某些情况下,我找不到文件,因此我添加了它们,在其他情况下,容器没有权限打开文件(位于 /dev/dri,因此我允许它访问该设备)

相关内容