本节书摘来自异步社区出版社《C++ AMP:用Visual C++加速大规模并行计算》一书中的第3章,第3.1节,作者: 【美】Kate Gregory , Ade Miller,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.9 数学库函数
C++ AMP:用Visual C++加速大规模并行计算
如前所述,我们不能只在parallel_for_each
中调用来自“核函数”的函数。调用函数应该在代码生成时可见,应该使用restrict(amp)
标记。如果我们要转换现有代码,就需要做出必要的调整。我们也有可能会调用sqrt()
或sin()
等库函数。因此,需要使用加速器兼容版本替换这些调用。好消息是amp_math.h
里定义了成百上千的此类函数,它们全都在命名空间concurrency::fast-math
下。那个文件里有4 000多行相关内容,在这里把它们全部列出来是不现实的。但是,我们可以简要地列出一些可能会有用的函数分类。
三角函数:cos
、sin
、tan
、arccos
、arcsin
、arctan
,加上6个双曲三角函数
根函数和幂函数:sqrt
、cbrt
、pow
简单操作:ceil
、floor
、round
、runc
、copysign
、abs
、mod
、max
、min
等
指数:exp
(e的x次方
),expm1
(e的x减1次方
)、exp2
(2的x方
)、exp10
(10的x方
)等
对数:log
(以e为底
)、log10
、log2
、log1p
(以e
为底的(x+1)
的对数)等
复合操作,例如fdim(如果为正是x−y
,否则是0
)、fma(x*y+z)
、hypot
(求平方和后的平方根)
如果你一贯使用标准库中的数学函数,那么很可能它们已经在amp_math.h
中有了对应的restrict(amp)
版本。还有一个命名空间concurrency::precise-math
,里面是函数的双精度版本,但我们只能在支持双精度数的加速器上使用它们。12.7节有更多关于双精度数支持的信息。