Vectorized/vectorizing C 函数

Vectorized/vectorizing functions in C

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

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

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

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

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

, _Generic and macros let you dispatch based on argument type. See this SO answer。如果 xdouble,那将允许 sin(x) 进行标量运算,如果 x 不是,则允许进行矢量运算。

中函数可以重载。同一个函数(或操作)可以对单个元素进行标量运算,对多个元素进行向量运算。您还可以将结果存储在 auto 类型变量中,因此您可以与 return 类型无关。

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

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

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

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

valarray,它对你的矢量化作用有限,但它没有得到编译器的很好支持,也不能很好地扩展。

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

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