首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C:更快地访问查找表?

C:更快地访问查找表?
EN

Stack Overflow用户
提问于 2014-01-03 17:33:53
回答 4查看 3.5K关注 0票数 16

我有一段代码,可以一次跟踪4个正弦。

我的original code每帧大约进行12000次sin()函数调用,并且以30fps的速度运行。

我尝试通过生成查找表来优化它。我最终得到了16个不同的查询表。我在程序顶部的一个单独的头文件中声明并加载它们。每个表都是这样声明的:

代码语言:javascript
复制
static const float d4_lookup[800] {...};

现在,有了这个新方法,我真的失去了fps?!我现在的速度是20帧/秒,而不是30帧/秒。现在每帧只需执行8次sin / cos调用和19200次查找调用,而不是12000次sin()调用。我使用启用了-O3标志的gcc进行编译。目前,查找表位于顶部,是程序全局范围的一部分。

我假设我没有将它们加载到正确的内存中,或者其他类似的东西。如何加快查找速度?

**编辑1 **

根据请求,下面是使用查找调用的函数,它每帧调用一次:

代码语言:javascript
复制
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%的速度,以使查找表以我想要的方式工作。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20900483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档