如何在Docker容器中运行OpenCL + OpenGL?

时间:2019-01-17 19:37:51

标签: docker opengl interop opencl nvidia-docker

目标是在docker容器中运行OpenCL / OpenGL(互操作)应用程序。但是我还没有成功。

简介

我有一台装有NVidia图形卡的笔记本电脑,所以我认为利用NVidia Dockerfile [1,2]是一个很好的起点。

以下Dockerfile:

# Dockerfile to run OpenGL app
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES},display
RUN apt-get update && apt-get install -y --no-install-recommends \
        mesa-utils && \
    rm -rf /var/lib/apt/lists/*

工作得很好,我能够运行glxgears

在自己的容器上运行OpenCL也不重要:

# Dockerfile to run OpenCL app
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
RUN apt-get update && apt-get install -y --no-install-recommends \
        ocl-icd-libopencl1 \
        clinfo && \
    rm -rf /var/lib/apt/lists/*
RUN mkdir -p /etc/OpenCL/vendors && \
    echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility

clinfo成功显示有关我的设备的信息。


尝试

最后,我尝试用OpenGL和OpenCL驱动程序创建一个容器:

# Dockerfile mixing OpenGL and OpenCL
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES},display
RUN apt-get update && apt-get install -y --no-install-recommends \
        mesa-utils \
        ocl-icd-libopencl1 \
        clinfo && \
    rm -rf /var/lib/apt/lists/*
RUN mkdir -p /etc/OpenCL/vendors && \
    echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility

现在,尽管clinfo仍在打印OpenCL设备信息,但是glxgears却因以下错误而失败:

Error: couldn't get an RGB, Double-buffered visual 

任何想法如何使这项工作有效吗?预先感谢。


参考

2 个答案:

答案 0 :(得分:0)

ENV NVIDIA_DRIVER_CAPABILITIES compute,utility

您忘记了功能display

答案 1 :(得分:0)

对我有用的是以下

  • STEP 1:在 Dockerfile 的末尾添加以下两行

      ENV NVIDIA_VISIBLE_DEVICES all
      ENV NVIDIA_DRIVER_CAPABILITIES compute,utility,display
    
  • 第 2 步:运行容器

      $ sudo xhost +local:root
      $ docker run --gpus all -it --rm --name container_name \
      -v /tmp/.X11-unix:/tmp/.X11-unix \
      -e DISPLAY=$DISPLAY \
      -e QT_X11_NO_MITSHM=1 \
      --net=host \
      image_name bash