从脚本中较高的函数调用脚本中较低的函数

时间:2009-09-05 14:44:47

标签: c++ optimization recursion simd sse2

我正试图想出一种让计算机为我做一些工作的方法。我正在使用SIMD(SSE2和SSE3)计算交叉产品,我想知道它是否可以更快。目前我有以下内容:

const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y

__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
   // (y * other.z) - (z * other.y)
   // (z * other.x) - (x * other.z)
   // (x * other.y) - (y * other.x)

   return
   (
      _mm_sub_ps
      (
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
         ),
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
         )
      )
   );
}

正如您所看到的,那里有四个_mm_shuffle_ps,我想知道我是否可以使用返回{{1}的_mm_unpackhi_ps_mm_unpacklo_ps替换它们分别为{}和a2 a3 b2 b3,速度稍快。

我无法在纸上弄清楚,但我想到了一个解决方案。如果让计算机强制执行所需的步骤怎么办?只需递归地逐步浏览不同的选项,看看是什么给出了正确的答案。

我用multiply工作,当我希望它返回时返回它(3,12,27,0):

a0 a1 b0 b1

非常好,如果我这样说的话。

但是,当我想实现鸿沟时,我偶然发现了一个问题。乘法不仅需要调用乘法,它还必须调用除法。好的,所以我们把鸿沟加倍。但是,鸿沟不仅要称为分裂,还必须调用乘法,这在脚本中较低,因此它尚不存在。

我开始使用Visual C ++中的空控制台应用程序,并将所有内容放在QuadTests.cpp中。

如何确保这两个功能可以相互呼叫?

提前致谢。

1 个答案:

答案 0 :(得分:1)

要确认一下,您的问题是这样安排的功能不起作用,因为当您从doStuff调用时未声明getFoo

int getFoo(int bar) {
    doStuff(bar + 1);
}

int doStuff(bar) {
    if (bar == 2) {
        return getFoo(bar);
    }

    return bar * 8;
}

要解决此问题,您需要int doStuff(int) // #includes, etc. go here int doStuff(int); int getFoo(int); // methods follow 。通常,这是通过头文件完成的 - 无论哪种方式,您只需要添加如下内容:

{{1}}