原子计数器缓冲区 Atomic Counter Buffers

2024-02-02 17:52

本文主要是介绍原子计数器缓冲区 Atomic Counter Buffers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Atomic Counter Buffers(原子计数器缓冲区)是OpenGL中一种用于并发访问的特殊缓冲区类型。它们提供了一种在着色器之间共享和操作原子计数器的方法,适用于需要处理并发读写访问的情况,比如粒子系统、计算机图形学中的某些算法等。

下面是关于Atomic Counter Buffers的基本概念和用法:

原子计数器缓冲区的基本概念:

  1. 原子计数器(Atomic Counters):原子计数器是一种特殊的变量,可以在并发情况下进行原子操作(原子操作是不可被中断的操作,能够保证操作的完整性)。原子计数器通常用于在多个线程或着色器之间共享和更新计数值,而不会出现数据竞争或不一致的情况。

  2. 原子计数器缓冲区(Atomic Counter Buffers):原子计数器缓冲区是一种专门用于存储原子计数器的缓冲区。它允许着色器并发地递增或递减计数器的值,而不会产生竞争条件。

使用原子计数器缓冲区的步骤:

  1. 创建原子计数器缓冲区对象:在OpenGL中,使用 glGenBuffers 创建一个缓冲区对象,并使用 glBindBuffer 将其绑定为原子计数器缓冲区(ATOMIC_COUNTER_BUFFER)。

  2. 初始化原子计数器缓冲区:使用 glBufferDataglBufferStorage 初始化原子计数器缓冲区,并分配足够的空间来存储原子计数器。

  3. 将原子计数器缓冲区绑定到着色器:使用 glBindBufferBaseglBindBufferRange 将原子计数器缓冲区绑定到着色器的指定绑定点。

  4. 在着色器中使用原子计数器:在着色器中,可以使用 atomicCounter 关键字声明原子计数器,并使用 atomicCounterIncrementatomicCounterDecrement 等原子操作函数对计数器进行操作。

原子计数器缓冲区的限制

针对每个着色器,有一组实现相关的最大限制,用于限制每个着色器引用的活动原子计数器缓冲区的数量。如果程序中任何着色器引用的原子计数器缓冲区绑定超出了相应的限制,则程序链接失败。可通过调用 GetIntegerv 函数,分别以 MAX_VERTEX_ATOMIC_COUNTER_BUFFERS、MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS、MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS、MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS、MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 和 MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 作为 pname 参数获取顶点、曲面细分控制、曲面细分评估、几何、片段和计算着色器的限制。

此外,对于程序的每个着色器阶段使用的活动原子计数器缓冲区的数量也有一种实现相关的限制。如果一个原子计数器缓冲区被多个着色器阶段使用,则每个使用将单独计算到此组合限制中。可以通过调用 GetIntegerv 函数,并将 pname 参数设置为 MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 获取组合原子计数器缓冲区使用限制。

原子计数器缓冲区对象存储
  • 存储在缓冲区对象中的原子计数器按如下方式在内存中表示:
    • atomic_uint 类型的成员通过读取指定偏移处的单个 uint 类型的值从缓冲区对象中提取。
    • atomic_uint 类型的数组按照元素顺序存储在内存中,数组元素的起始偏移为0。数组中每对元素之间的偏移量以基本机器单元为单位恒定,称为数组步长(UNIFORM_ARRAY_STRIDE的值始终为4),可在程序链接后查询。
原子计数器缓冲区绑定
  • 活动原子计数器的值从或写入到绑定到原子计数器缓冲区绑定点数组之一的缓冲区对象的数据存储中。可以通过调用 GetIntegerv 函数,并将 pname 参数设置为 MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 获取绑定点的数量。
  • 通过将目标设置为 ATOMIC_COUNTER_BUFFER,调用 BindBuffer* 函数之一,将缓冲区对象绑定为原子计数器的存储空间。
  • 每个程序的活动原子计数器缓冲区绑定对应一个原子计数器缓冲区绑定点。此绑定点在着色器文本中与布局限定符一起被明确或隐含地设置,详细描述在OpenGL着色语言规范中。

这篇关于原子计数器缓冲区 Atomic Counter Buffers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671515

相关文章

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

SQL2005 性能监视器计数器错误解决方法

【系统环境】 windows 2003 +sql2005 【问题状况】 用户在不正当删除SQL2005后会造成SQL2005 性能监视器计数器错误,如下图 【解决办法】 1、在 “开始” --> “运行”中输入 regedit,开启注册表编辑器,定位到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVer

Redis 篇-深入了解基于 Redis 实现分布式锁(解决多线程安全问题、锁误删问题和确保锁的原子性问题)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 分布式锁概述         1.1 Redis 分布式锁实现思路         1.2 实现基本的分布式锁         2.0 Redis 分布式锁误删问题         2.1 解决 Redis 分布式锁误删问题         3.0 Redis 分

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

多线程篇(并发相关类- 原子操作类)(持续更新迭代)

目录 前言 一、原子变量操作类(AtomicLong为例) 1. 前言 2. 实例 二、JDK 8新增的原子操作类LongAdder 三、LongAccumulator类原理探究 前言 JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大提高。 由于原子性操作类的原理都大致相同,这里讲解最简单的AtomicLo

【Java编程的逻辑】原子变量 CAS 显示锁

原子变量 在理解synchronized中有使用synchronized保证原子更新操作,但是使用synchronized成本太高了,需要先获取锁,最后还要释放锁,如果获取不到锁还需要等到。这些成本都是比较高的,对于这种情况,可以使用原子变量。 Java并发包中的基本原子变量类型有以下几种: AtomicBoolean:原子Boolean类型,常用来在程序中表示一个标志位 AtomicIn

工作集、granule、缓冲区、缓冲池概念及关系?

工作集、granule、缓冲区、缓冲池概念及关系? granule:为了让内存在db_chache_size和shared_pool_size之间高效的移动,oracle在9i重构SGA,使用固定大小的内存块即为granule。这个参数就是为什么当你分配给shared pool值的时候,为什么有时候比你分配的值要大一点,但是granule的整数倍。 缓冲区:内存存放数据的地方,类似于数

正点原子阿尔法ARM开发板-IMX6ULL(二)——介绍情况以及汇编

文章目录 一、裸机开发(21个)二、嵌入式Linux驱动例程三、汇编3.1 处理器内部数据传输指令3.2 存储器访问指令3.3 压栈和出栈指令3.4 跳转指令3.5 算术运算指令3.6 逻辑运算指令 一、裸机开发(21个) 二、嵌入式Linux驱动例程 三、汇编 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一

CAS与原子操作

什么是原子操作? 原子操作是一种在执行过程中不会被中断的操作。它要么完全执行成功,要么完全不执行,确保在操作完成之前其他线程不会看到操作的中间状态。 原子操作的实现 CAS CAS是由 CPU 提供的原子指令。在硬件级别上确保操作的原子性。不涉及上下文切换,性能高主要用途:单个变量更新 posix锁机制:mutex互斥锁、spinlock自旋锁 互斥锁依赖CAS,且涉及上下文切换,开销大

圆形缓冲区-MapReduce中的

这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构-环形缓冲区。 环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。 因为有简单高效的原因,甚至在硬件都实现了环形队列。 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用