- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个线程,其中有 GL 上下文,我制作所有渲染内容。在另一个线程中,我正在运行 OpenCL 程序。这两个任务必须与浮点值缓冲区进行交换。
现在,这个缓冲区是 OpenGL 2D 纹理(我想使用 3D,它会很好,但大多数设备不支持 cl_khr_3d_image_writes
以及我的)。正如预期的那样,因为纹理是在 GL 线程中创建的,然后当我尝试在另一个线程的 CL 程序中使用它时,应用程序失败(没有 GL 或 CL 错误,只是应用程序崩溃)。
是否有可能以某种方式使用两个线程和 CL-GL 互操作?
最佳答案
这样使用两个线程是完全可以的。但是,您必须明确注意缓冲区的同步。请参阅 OpenGL 规范的附录 D(“共享对象和多上下文”)。
粗略的流程是:
1) 在您的 GL 线程上执行 glFenceSync() 以创建 GLsync 对象 ( ARB_sync extension )。
2) 在任一线程上(OpenCL 是线程安全的)使用 clCreateEventFromGLsyncKHR() 从 GLsync(cl_khr_gl_event 扩展)创建一个 cl_event。
3) 在您的 CL 线程上,使用 clEnqueueAcquireGLObjects() 将步骤 2 中的 cl_event 作为等待列表中的事件(cl_khr_gl_sharing 扩展名)传入。可能保留创建的 cl_event。
4) 继续进行 CL 处理。如果您使用的是乱序队列,请确保使用步骤 2 中由 clEnqueueAcquireGLObjects() 创建的 cl_event。
5) 在您的 CL 线程上使用 clEnqueueReleaseGLObjects() 创建一个 cl_event(cl_khr_gl_sharing 扩展名)。
6) 在您的 GL 线程上(OpenGL 不是线程安全的)使用 glCreateSyncFromCLeventARB() 从步骤 5 的 cl_event(GL_ARB_cl_event 扩展名)创建 GLsync 对象。
7) 回到您的 GL 线程,使用 glWaitSync() 等待 GLsync 对象(ARB_sync extension 扩展名)。
8) 继续进行 GL 处理。
9) 回到第一步
这只是关于创建同步对象并在两个 API 之间传递它们:)
关于c++ - OpenGL-CL多线程互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559873/
我有一个问题 SELECT DISTINCT SQL_CALC_FOUND_ROWS cl.id AS id, cl.column1 AS column1, cl.column2 AS column2
我有一个 CL 编号,我想要该更改列表后提交的所有更改列表的 CL 编号。是否有执行此操作的 perforce 命令? 最佳答案 p4 changes //... @yourchangelistnum
我正在使用安装了 quicklisp 的 clozure cl(版本 1.8-r15286m)在 Windows 7 64 位系统上工作。 我需要一些用于普通 lisp 的 freetype2 绑定(
我有示例“你好,世界!”来自网络的代码,我想在我大学服务器的 GPU 上运行它。当我输入“gcc main.c”时,它会响应: CL/cl.h: No such file or directory 我
我正在尝试在 Android Studio 中构建一个 openCL 程序,但一直遇到以下问题: Android Studio fatal error: CL/cl.h No such file or
我正在开发一个 kiosk gui,它是用 ruby/gtk 编写的,使用的是 ubuntu。我希望能够从 ruby/gtk gui 中重新启动——具体来说,我想让刷管理卡的人选择重新启动机器
我安装的一些 elisp 函数会生成警告: `flet' is an obsolete macro (as of 24.3); use either `cl-flet' or `cl-letf'. 如
我正在尝试成功执行一个来自名为 Sia Coin 的新加密货币的 make 文件。可以在这里找到Sia Coin GPU Miner 。它相对较新,因此有些东西需要更多的手动安装。我在 Ubuntu
我正在尝试在 C++ 的 Visual Studio 2015 中使用 OpenCL 在 Windows 7 上编译一个简单的“hello world”程序。尝试构建时,出现此错误: Cannot o
我正在使用 OpenCL 运行内核基准测试。我知道我可以使用 OpenCL 供应商提供的各种工具(即 ioc64 或 poclcc)离线编译内核。问题是我得到的性能结果我无法用这些工具的程序集、Ope
在 iAP88/86 文档中,移位和循环的时序信息取决于 CL 中的移位计数 (p2-64)。这似乎暗示它在 CL 中循环计数,进行那么多单位移位。 所以我的问题是,在循环/移位完成后,CL 是否仍然
所以我尝试制作这样的布局: 一种方法是使用底部应用栏 Anatomy ,但底部应用栏的问题是它只能在坐标布局中使用。但我想要一个 ListView 或说它上面的任何其他 View ,所以我使用约束布局
我正在尝试通过 Qt Creator 在我的系统上运行“Valar”基准测试应用程序,但在构建代码时出现错误: https://github.com/Frinhard/valar-bench 我输入命
为了解决这个问题,我阅读了本网站提供的所有解决方案,但它仍然存在。 当我在 windows 10 C:\pyopencl-2016.2.1>setup.py install 中的 cmd 中运行此命令
我是 SYCL/OpenCL/GPGPU 的新手。我正在尝试构建和运行常量加法程序的示例代码, #include #include #include #include namespace sy
在大量搜索此问题的解决方案后,我发现尚未针对 Windows 正确记录此特定错误。所以我决定将这个问题连同解决方案一起发布。抱歉,如果我将其发布在错误的部分。我希望这个解决方案能帮助用户解决 PyOp
我是 CMake 的新手,在这里遇到了一些障碍,想知道这个问题是否有“优雅”的解决方案,或者可能只是一个简单的解决方案。 例如,为了设置编译器标志,我正在执行以下操作: target_compile_
我们正在使用带有gmake的VC++ 2015。该编译器如何确定它是Release版本还是Debug版本? cl.exe / nologo / Zc:wchar_t / wd4675 / wd4407
我正在尝试分析C++中OpenCL内核的性能。 我目前使用std::chrono每次在保存任何内容之前保存开始时间,然后再调用cl::finish(),然后保存结束时间。 虽然大多数结果看起来都是准确
我知道一点Scheme(很久以前读过SICP),写了这个程序: (define (prl k m) (define (print-line n) (cond ((> n 0) (displ
我是一名优秀的程序员,十分优秀!