损坏的 GLSL 自旋锁/GLSL 锁概要

2023-12-05

我有一个设置,需要锁定、读取一些数据、处理、写入一些数据,然后解锁。为此,我制作了一个锁定纹理作为layout(r32ui) coherent uniform uimage2D。临界区的数据的声明方式类似。

不幸的是,我对自旋锁的所有尝试都无法阻止竞争条件,从而导致错误的结果。我尝试了几种不同的方法。

我想我应该收集所有我能找到的有关 GLSL 锁定的信息以及我的结果(GTX 580M)。我已经添加了一个社区 Wiki 答案和这个详尽的列表。我希望对每个提出的可能问题进行编辑/评论,最终创建一个有效方法的列表。


我已将锁定纹理标准化为img0.

锁类型 1:

线程扭曲有一个共享程序计数器。如果单个线程抢到了锁,warp 中的其他线程仍然会卡在循环中。实际上,这可以编译,但会导致死锁。

例子:堆栈溢出, OpenGL.org

while (imageAtomicExchange(img0,coord,1u)==1u);

//<critical section>
memoryBarrier();

imageAtomicExchange(img0,coord,0);

锁类型 2:

为了解决类型 1 的问题,可以改为有条件地写入。在下面,我有时将循环编写为 do-while 循环,但 while 循环也无法正常工作。

锁类型2.1:

首先尝试的是一个简单的循环。显然,由于优化错误,这可能会导致崩溃(我最近没有尝试过)。

例子:NVIDIA

bool have_written = false;
while (true) {
    bool can_write = (imageAtomicExchange(img0,coord,1u)!=1u);

    if (can_write) {
        //<critical section>
        memoryBarrier();

        imageAtomicExchange(img0,coord,0);
        break;
    }
}

锁类型2.2:

上面的例子使用imageAtomicExchange(...),这可能不是人们尝试的第一件事。最直观的就是imageAtomicCompSwap(...)。不幸的是,由于优化错误,这不起作用。否则它(应该)是健全的。

例子:堆栈溢出

bool have_written = false;
do {
    bool can_write = (imageAtomicCompSwap(img0,coord,0u,1u)==0u);

    if (can_write) {
        //<critical section>
        memoryBarrier();

        imageAtomicExchange(img0,coord,0);
        have_written = true;
    }
} while (!have_written);

锁类型2.3:

从以下位置切换回来imageAtomicCompSwap(...) to imageAtomicExchange(...)是另一种常见的变体。与2.1的区别在于循环终止的方式。这对我来说不能正常工作。

例子:堆栈溢出, 堆栈溢出

bool have_written = false;
do {
    bool can_write = (imageAtomicExchange(img0,coord,1u)!=1u);

    if (can_write) {
        //<critical section>
        memoryBarrier();

        imageAtomicExchange(img0,coord,0);
        have_written = true;
    }
} while (!have_written);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

损坏的 GLSL 自旋锁/GLSL 锁概要 的相关文章

  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0
  • 存储 OpenGL 状态

    假设我正在尝试用 C 制作某种小型 opengl 图形引擎 我读过通过访问 opengl 状态glGet 函数可能非常昂贵 虽然访问 opengl 状态似乎是一个经常操作 并且强烈建议将 opengl 状态的副本存储在具有快速读 写访问权限
  • OpenGL 3.1 中已弃用 glLineStipple

    glLineStipple在最新的 OpenGL API 中已被弃用 它被替换成什么 如果不更换 怎样才能达到类似的效果呢 我当然不想使用兼容性配置文件 抱歉 它还没有被任何东西取代 我想到的第一个模拟它的想法是几何着色器 您向几何着色器提
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 如何在 Visual Studio 2012 中安装 GLUT 和 OpenGL?

    我今天刚安装了Visual Studio 2012 我想知道如何在该平台上安装GLUT和OpenGL OpenGL 应该已经存在 可能会缺少 Freeglut GLUT GLUT 现在已经非常过时并且没有得到积极的支持 所以你当然应该使用
  • LWJGL3:重载的 glBufferData 方法

    我正在使用 LWJGL 调用 OpenGL 函数 方法org lwjgl opengl GL15 glBufferData http javadoc lwjgl org org lwjgl opengl GL15 html glBuffer
  • OpenGL:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • 为什么 glClear 不清除我的屏幕?

    这是我编写的一个简单的 opengl 程序 我试图在绘制三角形之前清除屏幕 我在 init 函数中调用了 glClear 但是 它似乎无法清除屏幕 include
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • glColor4f() - alpha 值的效果

    我正在使用 glColor4f 令人惊讶的是 更改 alpha 即第四个参数 不会导致透明度发生任何变化 代码段是 const GLfloat squareVertices 0 5 0 5 0 0 0 5 0 5 0 0 0 5 0 5 0
  • 为什么 std::atomic 对象不可复制?

    看起来std atomic类型不可复制构造或复制分配 为什么 是否有技术原因导致无法复制原子类型 或者是故意限制接口以避免某种不良代码 在没有原子指令 或没有所有整数大小的原子指令 的平台上 类型可能需要包含互斥体以提供原子性 互斥锁通常不
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • 原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?

    微软提供了InterlockedCompareExchange http msdn microsoft com en us library ms683560 28VS 85 29 aspx用于执行原子比较和交换操作的函数 还有一个 Inte
  • 延迟阴影映射 GLSL

    我目前正在实施延迟渲染管道 但我仍坚持使用阴影贴图 我已经成功地将其实施到前向管道中 我所做的步骤是 获取灯光视图中的位置 转换为光视图剪辑空间 使用 0 5 0 5 获取阴影纹理坐标 检查深度 编辑 使用新结果图像更新代码 float c
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 在 OpenGL 中实例化数百万个对象:提高每秒帧数

    我的最终目标是以 60 fps 渲染 100 万个不同尺寸和颜色的球体 我也希望能够在屏幕上移动相机 我已经修改了代码我正在学习的教程的这一页 http learnopengl com Advanced OpenGL Instancing尝

随机推荐

  • 对 css nth-child 求模

    我想找到一种方法来按照模式显示一些颜色到 div 我发现了一个使用模数的技巧 但它似乎不适用于 CSS 因此 如下面的 codepen 示例所示 蓝色背景属性应应用于 1 8 13 20 25 块 gt 我们可以看到每个状态之间的差异是 7
  • 如何删除 firebase 中的值

    只是一个小问题 现在我有这个结构 images uniqueId id logement 1747657 image dataimage uniqueId id logement 1747657 image dataimage unique
  • Java错误java.util.concurrent.ConcurrentHashMap.keySet

    嘿 伙计 我收到了这个错误 你能尝试解决这个问题吗 或者看看有什么问题 发布修复之类的东西 非常感谢大佬 Exception in thread ExtensionHandler 1 java lang NoSuchMethodE rror
  • 比较 SQLAlchemy ORM 中两列之间的差异

    我正在尝试找出如何做类似答案的事情这个问题但使用 SQLAlchemy 在不诉诸原始 SQL 的情况下 很难找到如何根据两列之间的差异对查询结果进行排序 任何帮助是极大的赞赏 另外 出于好奇 是否可以创建一个自动计算其他两列之间差异的列 例
  • 带参数的 Orbeon 发送按钮

    我已经寻找了一段时间 但找不到一个解决方案 允许我在按下 保存最终 按钮时将请求参数从表单发送到外部 Web 应用程序 这是我到目前为止在properties local xml 中所拥有的内容
  • 检查 C# 中输入的数据类型是否正确

    我想要的是基本上让用户输入一个浮点数 然后系统检查输入是否确实是一个浮点数 如果是 那么它将继续执行代码 如果不是 那么用户将有以正确的数据类型重新输入 对于初学者的问题 抱歉 代码示例是 Console Write Response Va
  • 如何在异步函数中使用 threading.Lock,同时可以从多个线程访问对象

    我想用threading Lock 在异步函数中 asyncio Lock 不是线程安全的 所以我不能这样做with await asyncio Lock 我需要使用的原因threading Lock 是因为这个对象may可以通过多个线程访
  • 尝试使用“execvp()”运行“ls | grep r”

    我创建了一个pipe在两个子进程之间 首先 我跑ls 写入正确的 fd 然后 我跑grep r 从正确的 fd 读取 我可以在终端中看到grep命令工作正常 输出 问题是grep不会退出 它会留在那里 即使ls不再运行 对于其他程序pipe
  • JInternalFrame 位于前面并聚焦

    一个人如何推动一个JInternalFrame到 JDesktopPane 中所有框架的顶部 尝试grabFocus 和requestFocus 其中之一应该有效 我个人只使用了requestFocus
  • 表数据网关和模型

    我听说过 胖模型 瘦控制器 这句话 并且相信我理解它的含义 在工作过程中Zend 快速入门指南我遇到过表数据网关模式 在我看来 这种设计模式正在倡导 MVC 堆栈的第四个组件 它正在从 胖模型 转向 瘦模型 瘦控制器和胖 TableData
  • 如何使用自己类型的成员扩展类?

    假设我们需要使用一个名为 BaseNode 的类来实现不同类型的树 从该类派生出其他类型的节点 并且它假设有一个名为 BaseNode 的实例变量parent它自己的类型 通常看起来像 class BaseNode some fields
  • 在设备上调试 Android 应用程序

    我知道对此有很多问题 但没有一个对我的情况有帮助 我正在运行 Ubuntu 11 10 我正在尝试在我的 LG 手机上调试应用程序 我遵循了这个指南 http developer android com guide developing d
  • 达夫的设备如何工作?

    我读过维基百科上关于 Duff 设备的文章 我不明白 我真的很感兴趣 但我已经读了几次那里的解释 但我仍然不明白达夫的设备是如何工作的 更详细的解释是什么 其他地方有一些很好的解释 但让我尝试一下 这在白板上要容易得多 这是带有一些符号的维
  • UIPickerView EXC 访问错误?

    我不断收到错误访问错误 我认为这与我的 UIPickerView 有关 因为这是应用程序崩溃的时候 一切正常 直到我从 UIPickerView 中做出第九个选择 每次应用程序在第 9 个选择时崩溃 有任何想法吗 void viewDidL
  • 致命错误:CI_Session_files_driver 类包含 1 个抽象方法

    致命错误 CI Session files driver 类包含 1 个抽象方法 因此必须声明为抽象或实现其余的 方法 SessionHandlerInterface open 中 C xampp htdocs cmms2 system l
  • IBM Worklight 6.1 - “Ecma 错误:TypeError:无法调用对象中的属性

    我正在尝试在 Worklight 适配器示例中运行 Javaworklightadapterproject示例项目 但我在尝试调用过程时遇到错误 errors Ecma Error TypeError Cannot call propert
  • 自 2013 年 2 月 6 日起,通过“feed”连接使用 Graph API 向朋友墙发帖失败

    我的应用程序开始无法在朋友的提要上发布项目 我收到此错误 Facebook request error The operation couldn t be completed facebookErrDomain error 10000 de
  • VBA 的日期无法在 Excel 2011 中运行?

    这是我的代码 我正在尝试 它可以在 PC 上运行 但不能在 Mac 上运行 运行此代码并创建一个 Excel 工作表 命名 添加一个选项卡 更改所述选项卡的颜色 更改所述选项卡 然后转置数据 同时保持单元格的格式以及单元格的宽度和高度到新工
  • “忘记密码”实施的最佳方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找实现 忘记密码
  • 损坏的 GLSL 自旋锁/GLSL 锁概要

    我有一个设置 需要锁定 读取一些数据 处理 写入一些数据 然后解锁 为此 我制作了一个锁定纹理作为layout r32ui coherent uniform uimage2D 临界区的数据的声明方式类似 不幸的是 我对自旋锁的所有尝试都无法