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

如何在 acrobat 中链接表单域,使其表现为单个域

如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?

C# 中带 SIMD 的 2x2 矩阵向量积

演示代码在禁用优化的情况下未能显示 SIMD 速度快 4 倍

使用 SIMD 指令去交错音频通道