我有一段代码,可以一次跟踪4个正弦。
我的original code每帧大约进行12000次sin()函数调用,并且以30fps的速度运行。
我尝试通过生成查找表来优化它。我最终得到了16个不同的查询表。我在程序顶部的一个单独的头文件中声明并加载它们。每个表都是这样声明的:
static const float d4_lookup[800] {...};现在,有了这个新方法,我真的失去了fps?!我现在的速度是20帧/秒,而不是30帧/秒。现在每帧只需执行8次sin / cos调用和19200次查找调用,而不是12000次sin()调用。我使用启用了-O3标志的gcc进行编译。目前,查找表位于顶部,是程序全局范围的一部分。
我假设我没有将它们加载到正确的内存中,或者其他类似的东西。如何加快查找速度?
**编辑1 **
根据请求,下面是使用查找调用的函数,它每帧调用一次:
void
update_sines(void)
{
static float c1_sin, c1_cos;
static float c2_sin, c2_cos;
static float c3_sin, c3_cos;
static float c4_sin, c4_cos;
clock_gettime(CLOCK_MONOTONIC, &spec);
s = spec.tv_sec;
ms = spec.tv_nsec * 0.0000001;
etime = concatenate((long)s, ms);
c1_sin = sinf(etime * 0.00525);
c1_cos = cosf(etime * 0.00525);
c2_sin = sinf(etime * 0.007326);
c2_cos = cosf(etime * 0.007326);
c3_sin = sinf(etime * 0.0046);
c3_cos = cosf(etime * 0.0046);
c4_sin = sinf(etime * 0.007992);
c4_cos = cosf(etime * 0.007992);
int k;
for (k = 0; k < 800; ++k)
{
sine1[k] = a1_lookup[k] * ((bx1_sin_lookup[k] * c1_cos) + (c1_sin * bx1_cos_lookup[k])) + d1_lookup[k];
sine2[k] = a2_lookup[k] * ((bx2_sin_lookup[k] * c2_cos) + (c2_sin * bx2_cos_lookup[k])) + d2_lookup[k] + 50;
sine3[k] = a3_lookup[k] * ((bx3_sin_lookup[k] * c3_cos) + (c3_sin * bx3_cos_lookup[k])) + d3_lookup[k];
sine4[k] = a4_lookup[k] * ((bx4_sin_lookup[k] * c4_cos) + (c4_sin * bx4_cos_lookup[k])) + d4_lookup[k] + 50;
}
}**更新**
对于任何阅读这篇文章的人来说,我放弃了这个问题。我尝试使用OpenCL内核、结构、SIMD指令以及这里显示的所有解决方案。最后,计算每帧sinf() 12800的原始代码比查找表工作得更快,因为查找表不适合缓存。然而,它仍然只有30fps。它只是有太多的东西要跟上我对60fps的期望。我决定走一个不同的方向。感谢为这个帖子做出贡献的每一个人。这些解决方案中的大多数可能会获得一些像样的速度改进,但并不像我这里需要的200%的速度,以使查找表以我想要的方式工作。
https://stackoverflow.com/questions/20900483
复制相似问题