如何解决用于并行求和的 Vulkan 计算着色器
我想实现这个算法
https://dournac.org/info/gpu_sum_reduction
在 Vulkan 的计算着色器中。在 OpenCL 中,这很容易,因为我可以明确声明
哪些缓冲区是 __local
,哪些是 __global
。不幸的是,我似乎无法找到
Vulkan 中的任何此类机制。请有经验的人给我举个例子,如何让这些东西在 Vulkan 中工作?
解决方法
Vulkan 中的子组功能相同。这是一个着色器调用可以在子组中协作的功能。
也许是这样的:
void main(){
int partial_sum = subgroupAdd(arr[gl_GlobalInvocationID.x]);
if (subgroupElect()) {
atomicAdd(mem,partial_sum);
}
}
你可以学习Subgroup Tutorial。
再说一次,您可以简单地尝试以“正常”方式进行操作:
void main(){
int partial_sum = 0;
for( int i = 0; i < LOCAL_SIZE; ++i ){
partial_sum += arr[gl_WorkGroupID.x * gl_WorkGroupSize.x + i]
}
atomicAdd(mem,partial_sum); // or perhaps without atomics by recursively reducing
}
它不是那么“平行”,但又不需要障碍。这只是衡量性能以找出最有效的方法的问题,也可能取决于您假设输入数组有多大。
免责声明:我没有尝试过着色器,所以假设它们是一种伪代码并且可能有错误。
也应该可以几乎逐字地实现您的链接算法。相当于计算 GLSL 中的 __local
是 shared
。 GLSL 中的工作组障碍是 memoryBarrierShared()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。