gpt4 book ai didi

c++ - OpenGL glutInit() : XOpenDisplay() causing segmentation fault

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:14 27 4
gpt4 key购买 nike

我正在执行一个 CUDA API 虚拟化项目。该项目基于 QEMU 管理程序。我使用的是最新版本 2.6.0rc3。我已经完成了核心模块,这个问题是关于演示它的。QEMU 2.6.0rc3 有 OpenGL 支持。

我在 VM 上运行了以下程序来测试 OpenGL 支持,它的执行没有任何问题。

#include <GL/freeglut.h>
#include <GL/gl.h>

void renderFunction()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("OpenGL - First window demo");
glutDisplayFunc(renderFunction);
glewInit();
glutMainLoop();
return 0;
}

我还使用了 CUDA 6.5 工具包中名为“simpleGL”的 NVIDIA 样本图形演示,网址为 https://developer.nvidia.com/cuda-toolkit-65 .该演示使用 OpenGL 来描绘波形,并使用 CUDA 进行底层计算来模拟它。当我运行这个演示程序时,在调用 glutInit() 时出现段错误。这是演示中的相关代码段。

bool initGL(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(window_width, window_height);
glutCreateWindow("Cuda GL Interop (VBO)");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMotionFunc(motion);
glutTimerFunc(REFRESH_DELAY, timerEvent,0);

// initialize necessary OpenGL extensions
glewInit();

if (! glewIsSupported("GL_VERSION_2_0 "))
{
fprintf(stderr, "ERROR: Support for necessary OpenGL extensions missing.");
fflush(stderr);
return false;
}

// default initialization
glClearColor(0.0, 0.0, 0.0, 1.0);
glDisable(GL_DEPTH_TEST);

// viewport
glViewport(0, 0, window_width, window_height);

// projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)window_width / (GLfloat) window_height, 0.1, 10.0);

SDK_CHECK_ERROR_GL();

return true;
}

这是 gdb 调用堆栈。

#0  0x00007ffff57d2872 in XOpenDisplay ()
from /usr/lib/x86_64-linux-gnu/libX11.so.6
#1 0x00007ffff76af2a3 in glutInit ()
from /usr/lib/x86_64-linux-gnu/libglut.so.3
#2 0x000000000040394d in initGL(int, char**) ()
#3 0x0000000000403b6a in runTest(int, char**, char*) ()
#4 0x00000000004037dc in main ()

根据我的研究,在尝试打开窗口时会发生段错误。我对 OpenGL 内部工作的了解非常有限,非常感谢这方面的一些帮助。谢谢。

最佳答案

I'm carrying out a project for virtualization of CUDA API

如果没有 NVidia 的支持,我怀疑您是否可以自己完成此任务。

你正在做一些以粗鲁的方式发生冲突的事情:

首先,您在 QEmu 环境中运行所有内容,这意味着,如果您不通过 IOMMU 虚拟化将 GPU 传递到 VM 中,那么其中的 CUDA 运行时将无法使用。 CUDA 旨在直接与 GPU 对话。

接下来,您将在 VM 中使用 Mesa OpenGL 实现。 Mesa 有一个专门的后端通过 QEmu 将 OpenGL 命令传递到它“外部”的 OpenGL 实现。这或多或少是一个远程过程调用,它搭载在同样的代码路径上,这些代码路径也通过 X11 传输实现间接 GLX。

CUDA 内部链接到 libGL.so,但它期望看到的 libGL.so 是 NVidia 驱动程序之一,而不是一些任意的 libGL.so。由于 libcuda.so 和 libGL.so 作为同一个驱动程序包的一部分,即 NVidia 驱动程序。有关于特定 libGL.so 的某些内部“知识”,因此相应的 libcuda.so 拥有并尝试使用。如果没有正确的 libGL.so,它将无法工作。

如果您想在 VM 中使用 CUDA(完全可能),您必须将整个 GPU 传递到 VM 中。您可以通过加载 pci_stub 内核模块,将 NVidia GPU 配置为要附加到 stub 的设备,然后启动带有 GPU 设备直通的 QEmu VM(实际上也应该可以热插拔直通)来完成此操作,但我从未尝试过)。为此,nvidia 内核模块必须没有取得 GPU 的所有权。因此,如果您有多个 NVidia GPU 并且只想通过其中的一个子集,则必须在加载 nvidia 内核模块之前将它们附加到 pci_stub。然后在 VM 中,您可以像往常一样使用 NVidia 驱动程序。

关于c++ - OpenGL glutInit() : XOpenDisplay() causing segmentation fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com