是否可以使用 OpenGL 计算着色器对 mat/vec 类型进行缩减或原子操作?
Is a reduction or atomic operation on mat/vec types with OpenGL compute shader possible?
是否可以在计算机着色器中执行 reduction/update 或原子操作,例如mat3
、vec3
数据类型?
喜欢这个方案:
some_type mat3 A;
void main() {
A += mat3(1);
}
我尝试过使用着色器存储缓冲区对象 (SSBO
),但似乎更新不是原子的(至少当我读回缓冲区时我得到了错误的结果)。
有没有人有实现这一点的想法?也许创建一个微小的 3x3 image2D
并将 imageAtomicAdd
的结果存储在那里?
GLES 3.1 中有基于缓冲区的原子。
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
第 7.7 节
Maybe creating a tiny 3x3 image2D and store the result by imageAtomicAdd in there?
图像原子不是核心,需要扩展。
Thank you for the links. I forgot to mention that I work with ARM Mali GPUs and as such they do not expose TLP and do not have warps/wave fronts as Nvidia or AMD. That is, I might have to figure out another quick way.
评论中针对您的 post 提出的技术(特别是将结果的上半部分向下折叠的 log(N) 除数方法)在马里仍然可以正常工作。该技术不依赖于 warps/wavefronts - 正如最初的 poster 所说,您只需要同步(例如使用 barrier()
而不是依赖波前会给您的隐式屏障) .
是否可以在计算机着色器中执行 reduction/update 或原子操作,例如mat3
、vec3
数据类型?
喜欢这个方案:
some_type mat3 A;
void main() {
A += mat3(1);
}
我尝试过使用着色器存储缓冲区对象 (SSBO
),但似乎更新不是原子的(至少当我读回缓冲区时我得到了错误的结果)。
有没有人有实现这一点的想法?也许创建一个微小的 3x3 image2D
并将 imageAtomicAdd
的结果存储在那里?
GLES 3.1 中有基于缓冲区的原子。
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
第 7.7 节
Maybe creating a tiny 3x3 image2D and store the result by imageAtomicAdd in there?
图像原子不是核心,需要扩展。
Thank you for the links. I forgot to mention that I work with ARM Mali GPUs and as such they do not expose TLP and do not have warps/wave fronts as Nvidia or AMD. That is, I might have to figure out another quick way.
评论中针对您的 post 提出的技术(特别是将结果的上半部分向下折叠的 log(N) 除数方法)在马里仍然可以正常工作。该技术不依赖于 warps/wavefronts - 正如最初的 poster 所说,您只需要同步(例如使用 barrier()
而不是依赖波前会给您的隐式屏障) .