减少C中二维连接的时间

时间:2013-12-14 15:23:16

标签: c join 2d sse simd

最近我用C编写了一个程序。在代码执行过程中,数据计算是瓶颈。如下:

数据结构是: typedef struct tuple_t{ int oid; int min_x; int min_y; int max_x; int max_y; }tuple_t

代码是

for (i = 0; i < Qry->num_tuples; i++) {
tuple_t Qi = Qry->tuples[i];
for (j = 0; j < Obj->num_tuples; j++) {
 tuple_t Oj = Obj->tuples[j];
 int test_top_bit = (Oj.min_x - Qi.min_x) | (Qi.max_x - Oj.min_x)
     | (Oj.min_y - Qi.min_y) | (Qi.max_y - Oj.min_y);
     test_top_bit >= 0 ? matches++ : 0; 
  }

} 该代码用于测试点是否在二维矩形中。 Qry-> num_tuples和Obj-&gt; num_tuple是500万。我运行测试,时间是887百万秒。 我测试了clasue

if(Oj.min_x == Qi.min_x)
    count++;

时间只有300万秒。所以主要的时间花在了这个条款上:

int test_top_bit = (Oj.min_x - Qi.min_x) | (Qi.max_x - Oj.min_x)
     | (Oj.min_y - Qi.min_y) | (Qi.max_y - Oj.min_y);
     test_top_bit >= 0 ? matches++ : 0;

我使用了另一种连接算法,但时间仍然很长。

有没有改善测试的性能?SIMD的SSE可以使用吗?

1 个答案:

答案 0 :(得分:1)

看看这一行,我发现了一个性能问题:

tuple_t Oj = Obj->tuples[j];

除了清洁代码之外,你无缘无故地复制这个结构25万亿次。 请尝试使用指针。     tuple_t * pOj =&amp; Obj-&gt; tuples [j];

你也可以避免分支:

匹配+ =((Oj.min_x - Qi.min_x)|(Qi.max_x - Oj.min_x)|              (Oj.min_y - Qi.min_y)| (Qi.max_y - Oj.min_y))&gt; = 0;