- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在执行一个 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/
Display XOpenDisplay(0) 和 XOpenDisplay(NULL) 有什么区别? #include struct MwmHints { unsigned long fl
我对 XOpenDisplay 函数没有什么问题。在学校我可以运行程序并且在使用 XOpenDisplay("ip:0") 时它运行良好,但是在我在家里的本地机器上运行程序时(更改当前的 ip)出现“
我有如下代码 bool isValidDisplay() { if (!XOpenDisplay(NULL)) { return false; } return true
谁能向我解释为什么 XOpenDisplay() 不会因为错误的显示名称而失败?只要名称遵循语法约定,它似乎总能成功——即使指定的主机名不存在。 XOpenDisplay() 似乎仅在字符串使用错误语
我安装了 x11vnc 然后执行 x11vnc 但失败了 错误信息如下 $x11vnc -display :0 08/05/2017 19:18:22 x11vnc version: 0.9.13 l
所以我正在开发一些代码,使用 X11 库在 Linux 上与 X-Windows 一起工作。我找到了一些简单的教程,但它们没有详细介绍更多实际用例的最佳实践。 我想知道的一件事是,我应该为每个应用程序
我有一个 *.SO 库,当从应用程序调用时,它会从指定窗口中删除窗口装饰。这是我的代码: #include struct MwmHints { unsigned long flags;
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我正在执行一个 CUDA API 虚拟化项目。该项目基于 QEMU 管理程序。我使用的是最新版本 2.6.0rc3。我已经完成了核心模块,这个问题是关于演示它的。QEMU 2.6.0rc3 有 Ope
现在我觉得自己很愚蠢。我正在尝试在 Qt Creator 中使用 xlib 做一些事情。 我的代码: #include #include int main(int argc, char *argv
本文整理了Java中com.sun.jna.platform.unix.X11.XOpenDisplay()方法的一些代码示例,展示了X11.XOpenDisplay()的具体用法。这些代码示例主要来
我编写了一个程序,该程序在登录后在终端中以 ROOT 权限运行,但在重新启动后调用 XOpenDisplay(NULL) 时失败。该程序通过 rc.local 启动,但似乎无法看到 X11。 我需要
这个问题遵循这个 one .我能够找到该库,但在加载时会引发以下错误 java.lang.UnsatisfiedLinkError: /home/name/Documents/Development/
我是一名优秀的程序员,十分优秀!