gpt4 book ai didi

c++ - 在表中预计算一次 cos() 和 sin()

转载 作者:可可西里 更新时间:2023-11-01 14:50:34 26 4
gpt4 key购买 nike

我想提高我的动态链接库 (DLL) 的性能。

为此,我想使用 cos()sin() 的查找表,因为我经常使用它们。

因为我想要最高性能,所以我想创建一个从 0 到 2PI 的表,其中包含生成的 cos 和 sin 计算。

为了在精度方面取得好的结果,我认为每个函数 1 mb 的表是大小和精度之间的一个很好的折衷。

我想知道如何在不使用外部文件(因为它是一个 DLL)的情况下创建和使用这些表:我想将所有内容保存在一个文件中。

此外,我不想在插件启动时计算 sin 和 cos 函数:它们必须计算一次并放入标准 vector

但是我如何在 C++ 中做到这一点

EDIT1:来自 jons34yp 的代码非常适合创建 vector 文件。

我做了一个小基准测试,发现如果您需要良好的精度和速度,您可以在它们之间进行 250000 单位 vector 和线性插值,您将有 7.89E-11 最大误差(!),这是最快的我尝试过的所有近似值(它比 sin() 快 12 倍以上(正好快 13,296 倍)

最佳答案

最简单的解决方案是编写一个单独的程序来创建一个包含 vector 定义的 .cc 文件。

例如:

#include <iostream>
#include <cmath>

int main()
{
std::ofstream out("values.cc");

out << "#include \"static_values.h\"\n";
out << "#include <vector>\n";

out << "std::vector<float> pi_values = {\n";
out << std::precision(10);

// We only need to compute the range from 0 to PI/2, and use trigonometric
// transformations for values outside this range.
double range = 3.141529 / 2;
unsigned num_results = 250000;

for (unsigned i = 0; i < num_results; i++) {
double value = (range / num_results) * i;
double res = std::sin(value);

out << " " << res << ",\n";
}
out << "};\n"
out.close();
}

请注意,这不太可能提高性能,因为这种大小的表可能不适合您的二级缓存。这意味着很大一部分三角函数计算将需要访问 RAM;每次这样的访问都会花费大约数百个 CPU 周期。

顺便问一下,您是否看过近似的 SSE SIMD 三角函数库。这对他们来说似乎是一个很好的用例。

关于c++ - 在表中预计算一次 cos() 和 sin(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18531571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com