2009-09-05 39 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