我正在做一些统计计算。我需要它们快速,所以我重写了大部分以使用 SSE。我对它很陌生,所以我想知道这里的正确方法是什么:
据我所知,SSE 中没有 log2 或 ln 函数,至少没有到 4.1,这是我使用的硬件支持的最新版本。
是否更好:
- 提取 4 个浮点数,并对它们进行 FPU 计算以确定熵 - 我不需要将任何这些值加载回 SSE 寄存器,只需将它们相加到另一个浮点数
- 为 SSE 找到一个执行 log2 的函数
我正在做一些统计计算。我需要它们快速,所以我重写了大部分以使用 SSE。我对它很陌生,所以我想知道这里的正确方法是什么:
据我所知,SSE 中没有 log2 或 ln 函数,至少没有到 4.1,这是我使用的硬件支持的最新版本。
是否更好:
没有实现对数函数的 SSE 指令。但是,也没有单个 x86 指令可以执行通用对数。如果您正在考虑使用类似C 标准库log
或log10
来自 C 标准库的对数函数,那么值得看看在 libc 等开源库中使用的实现。您可以轻松滚动您自己的对数近似值,该对数近似值在 SSE 寄存器中的所有元素上运行。
这样的函数通常使用多项式近似来实现,该多项式近似在输入参数的某个区域(例如泰勒级数)的某个精度规范内有效。然后,您可以利用对数属性将通用输入参数包装到对数例程的可接受输入范围内。此外,您可以利用以下属性参数化对数的底:
log_y(x) = log_a(x) / log_a(y)
a
您创建的对数例程的底在哪里。