【问题标题】:Vectorized/vectorizing functions in C [closed]C中的向量化/向量化函数[关闭]
【发布时间】:2021-07-09 15:16:12
【问题描述】:

对我来说,R 或 Scilab 等语言中最有趣的功能之一是可以通过矢量化函数并行化操作“意味着函数将对向量的所有元素进行操作,而无需一次循环并作用于每个元素”,用The Carpentries 的话来说)。这应该使代码更清晰,执行速度更快。

我的问题是:这在 C 或 C++ 中是否可行?我们可以在 C 中创建可以对标量或向量进行操作的函数吗?我们可以像矢量化一样使用标准 C 函数吗?

也许 C 太快了以至于你不需要这个功能,但我想确定一下这个主题,因为这会影响我将算法转换为代码的方式。

更具体地说,如果我想对 C 中向量的每个元素应用一个函数,我应该使用循环,还是有其他替代方法?

【问题讨论】:

  • R 的大多数实际工作马函数都是用 C 或 C++ 编写的。您可以检查来源。
  • @wildplasser 是什么意思?
  • 也就是说,这不是一个好问题。它太宽泛了,并且来自于语言未被真正理解的地方。要了解 C,请学习 C。
  • 在 C 中,运算符不能重载。您的问题在 C++ 中有意义,而不是 C。
  • 如果您的代码在编写时考虑了矢量化,那么好的编译器可以自动矢量化它,而无需程序员进行任何显式矢量化。

标签: c++ c parallel-processing vectorization scilab


【解决方案1】:

之前)中,不能重载给定的“函数调用”。如果您想要对向量进行操作的函数或对元素进行操作的函数,则这些函数应该具有不同的名称。

使用_Generic 和宏可以让您根据参数类型进行调度。见this SO answer。如果xdouble,这将允许sin(x) 执行标量运算,如果x 不是,则允许执行向量运算。

中的函数可以重载。同一个函数(或运算)可以对单个元素进行标量运算,也可以对多个元素进行向量运算。您还可以将结果存储在 auto 类型变量中,因此您可以不知道返回类型。

编写将标量操作转换为向量的胶水代码仍然需要在某个地方完成,而 C++ 自动编写该胶水代码的能力有限。

现在,您可以编写 样式标记的联合,可以包含向量或标量,并让操作它们的代码在两种模式之间动态切换。

中,您可以编写在矢量和标量实现之间静态切换的模板代码。

这两种解决方案都不是任何一种语言的初学者都能成功做到的。

valarray,它对你的向量化能力有限,但编译器不支持它,也不能很好地扩展。

各种库支持对有限的一组操作进行有效的矢量化;例如,任何好的矩阵库。

大多数高级(比 C/C++)语言最终都以 C 或 C++ 或(在某些情况下)更直接地在汇编中实现它们的低级高速代码。通常带有汇编或“内在”增强的 C/C++ 足以获得他们想要的最大性能加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2013-10-09
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多