当前位置: 首页 > news >正文

关于Unity中ComputeShader 线程id的理解

结论:

index是index,id是id,index是一维数组索引,而uint2 id : SV_DispatchThreadID中的id 是二维数组坐标

今天看到一段代码,对ComputeShader 线程id的一些理解记录一下,如果有不对请理解

这里对于我来说是有一些误区的,正常写代码中 id 都是0,1,2,3这种整数下标,所以我脑子里也有了思维误区,对这个uint2 id : SV_DispatchThreadID有了新的认识,

ComputeShader的这个id其实是二维的

所以 id.x 的范围是 0-63

所以 id.y的范围是 0-63

而id的范围应该是(0,0)到(63,63)

下面的例子中,一共生成了8*8=64个线程组,每个线程组8*8=64个线程,所以总的线程应该是4096个线程,当时一直在纠结

 id.x 的范围是 0-63,id.y的范围是 0-63,为啥id的范围也是0-63,那不就相当于64*64*64个线程了吗?

这里需要理解的是

index是index,id是id,index是一维数组索引,而uint2 id : SV_DispatchThreadID中的id 是二维数组坐标

我们要取 0-4095 索引的元素,那么我们应该是

uint index = id.x + id.y * 64;

PointBuffer[index]

这样不就能取到该元素了吗

  float2 p = (id - 31.5) / 32;

_computeShader.Dispatch(0, 8, 8, 1);

#pragma kernel WaveAnimationfloat Time;
RWStructuredBuffer<float4> PointBuffer;[numthreads(8, 8, 1)]
void WaveAnimation(uint2 id : SV_DispatchThreadID)
{float2 p = (id - 31.5) / 32;float l = length(p);float h = sin(l * 7 - Time * 2) * 0.2;float c = l * 0.3 + Time * 0.1;uint index = id.x + id.y * 64;PointBuffer[index] = float4(p.x, h, p.y, c);
}

以下是一些帮助理解:

计算示例:

假设我们要找线程组(2,3)中的线程(1,2):GroupID = (2, 3, 0)
GroupThreadID = (1, 2, 0)DispatchThreadID = (2×8 + 1, 3×8 + 2, 0×1 + 0) = (16 + 1, 24 + 2, 0)= (17, 26, 0)

完整的线程分布

全局线程分布 (64×64):
每个小格子代表一个线程组(8×8线程),整个大网格有8×8=64个线程组┌─────────────────────────────────────────────────────────────┐
│ 线程组(0,0)    线程组(1,0)     ...      线程组(7,0)         │
│  ┌───────┐     ┌───────┐               ┌───────┐           │
│  │8×8线程│     │8×8线程│       ...      │8×8线程│           │
│  └───────┘     └───────┘               └───────┘           │
├─────────────────────────────────────────────────────────────┤
│ 线程组(0,1)    线程组(1,1)     ...      线程组(7,1)         │
│  ┌───────┐     ┌───────┐               ┌───────┐           │
│  │8×8线程│     │8×8线程│       ...      │8×8线程│           │
│  └───────┘     └───────┘               └───────┘           │
├─────────────────────────────────────────────────────────────┤
│     ...           ...         ...           ...            │
├─────────────────────────────────────────────────────────────┤
│ 线程组(0,7)    线程组(1,7)     ...      线程组(7,7)         │
│  ┌───────┐     ┌───────┐               ┌───────┐           │
│  │8×8线程│     │8×8线程│       ...      │8×8线程│           │
│  └───────┘     └───────┘               └───────┘           │
└─────────────────────────────────────────────────────────────┘

本文讨论了ComputeShader中线程ID的理解误区。作者指出,在计算着色器中,SV_DispatchThreadID返回的id是二维坐标(id.x,id.y),而非一维数组索引。通过一个8x8线程组调度的例子,解释了如何将二维id转换为线性索引:index=id.x+id.y*64。文章还展示了完整的64x64线程分布结构,说明线程组与线程的层级关系,并提供了坐标转换公式和计算示例,帮助理解ComputeShader中的线程调度机制。

http://www.dtcms.com/a/495451.html

相关文章:

  • 幽冥大陆(十六)纸币器BV20识别纸币——东方仙盟筑基期
  • 设计网站的方法做彩票网站需要什么条件
  • Windows 平台 HOOK DWM 桌面管理程序,实现输出变形的桌面图像到显示器
  • Java 大视界 -- Java 大数据在智能电网电力市场交易数据分析与策略制定中的关键作用
  • 安徽和县住房城乡建设局网站wordpress移动端顶部导航栏
  • oracle:判断字段不以开头
  • 学习笔记3-深度学习之logistic回归向量化
  • 哈尔滨网站建设网站优秀个人网站设计欣赏
  • 高辐射环境下AS32S601ZIT2型MCU的抗辐照性能与应用潜力分析
  • 基于STM32F407与FT245R芯片实现USB转并口通信时序控制
  • Retrofit 与 OkHttp 全面解析与实战使用(含封装示例)
  • qiankun知识点
  • 面向接口编程与自上而下的系统设计艺术
  • 数据结构基石:单链表的全面实现、操作详解与顺序表对比
  • 网站 无限下拉做一个小程序需要多少钱
  • 【Kubernetes】常见面试题汇总(二十六)
  • 微网站设计制作wordpress在线文档
  • “自来水”用英语怎么说?
  • 小杰深度学习(fifteen)——视觉-经典神经网络——MobileNetV1
  • 网站建设方任务 职责如何建设网站兴田德润可信赖
  • EWM - TM 集成(ASR)
  • 数据库数据插入与查询
  • 图书馆网站建设报告海报设计的基本要素
  • Sightline Intelligence边缘可操作情报-专为关键任务决策而打造
  • 2016-2023年全国内陆水体营养状态数据
  • MongoDB 固定集合
  • 【Linux】多路转接
  • 可视化开发 + AI:软件开发的黄金组合
  • 哪个网站做质量认证书范本ps教程
  • 河北邢台有几个区县合肥seo网站优化培训