SIMD 在这种情况下表现如何?
Posted
技术标签:
【中文标题】SIMD 在这种情况下表现如何?【英文标题】:How does SIMD behave in this case? 【发布时间】:2012-01-16 21:02:17 【问题描述】:我正在使用一个允许编写 SIMD 代码的引擎,它执行速度很快。但是只有一个块包含所有代码。
我知道这段代码在每个实体上同时独立运行,但是当只有一件事情发生变化时,无论如何计算它是否仍然更快?这是 SIMD 的想法,并行性吗?
例如:
void simdFunction ()
center = mesh.center(); // always the same
vert.pos.x = center.x; // run on each vertex
在这种情况下,中心总是相同的,那么SIMD上会不会对每个顶点进行计算呢?如果是这样,这仍然有效吗?
在一般 SIMD 编程意义上,能够并行运行它的成本是否超过了计算它的成本?
【问题讨论】:
【参考方案1】:此代码在每个实体上同时独立运行
不,这不是 SIMD 的工作原理。
使用 SIMD,所有算术单元都以锁步方式工作,执行相同的操作。没有任何独立性。
不过,一般来说,您最好在顺序代码中只计算一次共享常量。这样,SIMD 引擎将在每个顶点切片上花费更少的时间。
如果计算时间很短,SIMD 是协处理器(如 GPGPU)并且数据已经在该协处理器中,则例外情况。然后使用 SIMD 计算它可能会轻松地将数据移回顺序处理器并返回。
【讨论】:
谢谢 Ben,我现在似乎理解得更好了。但我无法控制这一点。引擎的规范定义我只能有一个 SIMD 上下文。我可以编写其他函数等,但只要我在主上下文中调用它们,它就会是同一件事。所以我想我别无选择。以上是关于SIMD 在这种情况下表现如何?的主要内容,如果未能解决你的问题,请参考以下文章
如何在有或没有 SIMD 内在函数的情况下从 Zig 构建和链接到 CGLM
如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?