我似乎找不到_mm_pow_ps或_mm256_pow_ps的内在函数,它们都应该包含在'immintrin.h'中。
Clang不会定义这些,还是在我不包括的标头中?
那不是内在的;这是一个英特尔库函数名称,该名称容易混淆地使用与实际内部函数相同的命名方案。 没有vpowps指示。 (至强融核上的AVX512ER确实具有半相关的vexp2ps说明...)
为了使此类功能_mm_sin_ps可用,您需要英特尔的短向量数学库(SVML)。大多数人只是避免使用它们。但是,如果它具有所需的实现,则值得研究。IDK还有哪些其他矢量pow实现。
如果未选中此框,则在内在函数查找器中,可以避免在搜索结果中看到这些不可移植的功能SVML。
还有一些“复合”内在就像_mm_set_epi8()通常编译成多负载和洗牌这是跨编译器移植,并做内联,而不是被库函数的调用。
还要注意,这sqrtps是本机指令,_mm_sqrt_ps()真正的内在指令也是如此。IEEE 754将mul,div,add,sub和sqrt指定为“基本”操作,这些操作需要产生正确取整的结果(错误<= 0.5ulp),因此sqrt()非常特殊,并且具有直接的硬件支持,这与大多数其他“数学”不同库”功能。
有各种SIMD数学函数库。其中一些附带C ++包装库,该库允许a+b而不是_mm_add_ps(a,b)。
glibc libmvec-从glibc 2.22开始,支持OpenMP 4.0矢量数学函数。GCC知道如何自动向量化的一些功能,如cos(),sin()和可能pow()使用它。 该答案显示了一种不便的方式,将其显式地用于手动矢量化。(希望有更好的方法可能会在源代码中没有名称混乱的情况)。
Agner Fog的VCL具有一些数学函数,例如exp和log。(已获得GPL许可,但未获得 LGPL许可,因此只能在GPL兼容项目中使用)。
https://sleef.org/-显然仅在Windows上支持MSVC
英特尔自己的SVML(ICC附带;默认情况下,ICC使用SVML自动矢量化)。令人困惑的是它的原型immintrin.h与实际的内在函数一起存在。也许他们想诱使人们编写依赖于英特尔工具/库的代码。或者也许他们认为包含的内容越少越好,并且每个人都应该使用其编译器...
还涉及到:具有矩阵BLAS功能的Intel MKL(数学内核库)。
AMD ACML-报废的封闭源免费软件。我认为它仅具有循环遍历数组/矩阵的功能(如Intel MKL),而不具有单个SIMD向量的功能。
sse_mathfun(zlib许可证)SSE2和ARM NEON。似乎自2011年以来就没有更新过。但是确实有单向量数学/触发函数的实现。
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |