数组结构与结构体数组
选择有利于合并访问的布局
数组结构与结构体数组 是 CoddyKit 上的免费 CUDA Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CUDA Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CUDA Academy 课程共包含 4 节课。
存储记录的两种方式
假设每个粒子都有 x、y 和 z。您可以把它们放在一起,也可以分开存储,而这个选择会改变每个线程束的合并访问方式。
结构体数组
自然的 C++ 布局会把每条记录的字段依次紧挨着排列。这称为结构体数组。
struct Particle { float x, y, z; };
Particle p[N];结构体数组为何会分散访问
当线程束只读取每条记录中的 x 时,各个 x 值之间相隔 12 字节。这种固有的步长会浪费所读取的每个内存行中的大部分空间。
float xi = p[i].x; // x values are spaced by sizeof(Particle)数组结构
反过来,可以把所有 x 值放在一起,所有 y 值放在一起,再把所有 z 值放在一起。这称为数组结构。
float x[N];
float y[N];
float z[N];数组结构为何能合并访问
现在,32 个线程读取 x 时会访问 32 个连续的浮点数。这对应一个对齐的内存行,并且每个字段只需一次整齐的事务。
float xi = x[i]; // neighbors land in one line字段访问测试
请思考您的内核如何读取数据。如果线程需要遍历许多记录中的同一个字段,那么在 GPU 上,数组结构几乎总是更优。
何时结构体数组也适用
如果每个线程会一起使用一条记录的所有字段,结构体数组能让它们位于同一个内存行中,并且更有利于缓存。
关注带宽,而不只是风格
这不是风格偏好的问题。将结构体数组改为数组结构,只需减少浪费的字节,就可能在执行相同计算时显著提高实际吞吐量。
折中的混合方案
您可以先将少量记录分组,再在每个组内拆分字段。这种数组结构混合布局兼顾了合并访问和缓存局部性。
先设计,再优化
布局一旦到了后期很难更改,因为它会影响每个内核和每次复制。请尽早根据访问模式选择数组结构或结构体数组的形式。🧩
关键映射方式
GPU 经验法则:将不同字段分开放入数组,使每个线程束读取连续区域。对于按字段处理的内核,应优先使用数组结构。
快速检查
请选择能合并此访问的布局。
回顾
您比较了结构体数组和数组结构:需要使用完整记录时将字段放在一起,而线程束逐个字段遍历时,则将字段拆分到不同的数组中。🎉
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「数组结构与结构体数组」课时是免费的吗?
是的 — 「数组结构与结构体数组」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CUDA Academy 课程的其余内容,请升级到 CoddyKit PRO。 CUDA Academy 课程共包含 4 节课。
「数组结构与结构体数组」这节课中我会学到什么?
选择有利于合并访问的布局 你通过在浏览器中直接运行的动手代码来练习 CUDA Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CUDA Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CUDA Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「数组结构与结构体数组」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CUDA Academy 课中编写并运行代码吗?
能。每节 CUDA Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。