2009-09-05 84 views
0

我试图想出一种方法来让计算机为我做一些工作。我正在使用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的在那里,我不知道如果我能与_mm_unpackhi_ps_mm_unpacklo_ps的组合,其分别返回a2 a3 b2 b3a0 a1 b0 b1,并取代它们稍快。

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

我得到了它与多工作,当我想它返回它返回(3,12,27,0):

startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00); 
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00); 
result0 = _mm_mul_ps(startA, startB); 
// (3.00, 6.00, 9.00, 0.00) 
result1 = _mm_mul_ps(startA, result0); 
// (3.00, 12.00, 27.00, 0.00) 

非常好,如果我这样说自己。

但是,当我想实现鸿沟时,我偶然发现了一个问题。乘法不仅需要调用乘法,还必须调用除法。好吧,所以我们把分水岭放在上面乘。但鸿沟不仅不得不称为鸿沟,它还必须称为乘数,这在脚本中较低,因此它还不存在。

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

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

在此先感谢。

回答

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)forward declaration。通常情况下,这是一个头文件来完成的 - 无论哪种方式,你只需要添加这样的事情:

// #includes, etc. go here 

int doStuff(int); 
int getFoo(int); 

// methods follow 
+0

当然! :D 它只是滑了我的脑海,但我知道堆栈溢出的人类搜索引擎可以帮助我。 ;) – knight666 2009-09-05 15:00:05