C 语言中的矢量化/矢量化函数



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

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

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

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

在 c(c11 之前)中,给定的"函数调用"不能重载。 如果需要对向量进行操作的函数或对元素进行操作的函数,则这些函数应具有不同的名称。

使用 c11,_Generic和宏允许您根据参数类型进行调度。 看到这个 SO 答案。 这将允许sin(x)xdouble时进行标量运算,如果不是x则进行向量运算。

在 c++ 中,函数可以重载。 相同的函数(或操作)可以对单个元素执行标量操作,对多个元素执行向量操作。 您还可以将结果存储在auto类型变量中,因此您可以与返回类型无关。

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

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

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

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

C ++有valarray,它为你做了有限的矢量化,但它没有得到编译器的良好支持,也没有很好地扩展。

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

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

最新更新