如何通过英特尔 OpenCL SVML 使用 _mm256_log_ps?

Posted

技术标签:

【中文标题】如何通过英特尔 OpenCL SVML 使用 _mm256_log_ps?【英文标题】:How to use _mm256_log_ps by leveraging Intel OpenCL SVML? 【发布时间】:2018-08-11 05:00:55 【问题描述】:

我发现 _mm256_log_ps 不能与 GCC7 一起使用。关于 *** 的最常见建议是使用 ICC 或利用 OpenCL SDK。

下载SDK并解压RPM文件后,有3个.so文件:__ocl_svml_l9.so、__ocl_svml_e9.so、__ocl_svml_h8.so

有人可以教我如何使用这些 .so 文件调用 _mm256_log_ps 吗?

谢谢。

【问题讨论】:

如果您的计算可以在 GPU 上高效完成,请使用 OpenCL。如果您只想要一个 AVX2 log 函数,请使用现有的实现,它可以为您提供所需的速度/准确性权衡。例如How many clock cycles does cost AVX/SSE exponentiation on modern x86_64 CPU? 有一些库可能具有矢量化的全精度版本,包括 glibc libmvec。但为了更快的低精度,请参阅Efficient implementation of log2(__m256d) in AVX2(我的回答提到浮点数和双精度数) 相关:Fastest Implementation of Exponential Function Using AVX 对 exp 有一个快速近似实现 float exp for __m256 @PeterCordes 感谢您提供信息。实际上我已经尝试过 avx_mathfun.h 但是log256_ps 在 log(N 我也尝试使用-lmvec -lm。它将编译但在运行时中止并显示找不到_ZGVeN16v___expf_finite 啊,是的,处理极端情况(或不处理)是另一个领域是另一个权衡。如果您的用例从来没有负输入,您甚至不需要检查它们,从而使其更快。然后因为你在做位黑客,有一个问题是你是否只看符号位,并将-0.0 与负数混为一谈,或者你是否将其视为 IEEE 比较完全等于+0.0并返回-Inf。您似乎真的想调用一个实际的库函数,而不是仅仅选择一个可以内联并且不会浪费时间做任何您不想要的事情的自定义实现。 【参考方案1】:

您可以使用Eigen library 中的log 函数:

#include <Eigen/Core>

void foo(float* data, int size)

    Eigen::Map<Eigen::ArrayXf> arr(data, size);
    arr = arr.log();

根据编译标志,这会生成优化的 SSE 或 AVX 代码(以及其他架构的 SIMD)。该实现基于http://gruntthepeon.free.fr/ssemath/,它基于cephes。

【讨论】:

以上是关于如何通过英特尔 OpenCL SVML 使用 _mm256_log_ps?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL(英特尔平台)显示构建错误(-11),状态为 0

英特尔 SIMD - 如何检查 __m256* 是不是包含任何非零值

使用 AVX512 或 SVML 内在函数将压缩的 16 位整数与掩码相除

1 个 cpu 设备上 OpenCL 的并行性

如何获得英特尔架构 SIMD __m128 的标志

OpenCL 在调用 clGetPlatformIDs 时崩溃