2009-10-16 66 views
2

我們試圖以高性能的方式比較使用不等式操作的signed int值的兩個大小相同的本機數組,其中值爲<,< =>,>和> =。將許多值進行比較時,true/false結果將會輸入相同大小輸入的char陣列,其中0x00表示false0xff表示truesigned int數組的高性能比較(使用Intel IPP庫)

爲了實現這一目標,我們使用了英特爾IPP庫。問題在於我們發現從圖像和視頻處理庫中找到的名爲ippiCompare_*的操作只支持unsigned charIpp8u),signed/unsigned shortIpp16s/Ipp16u)和floatIpp32f)類型的函數。它不直接支持signed intIpp32s

我(只)設想解決這個的兩種可能的方式:

  • 鑄造數組的直接支持的類型之一,並執行在多個步驟進行比較(它將成爲兩倍大小的短陣列或四倍大小的char數組)併合並中間結果。

  • 使用另一個函數直接支持來自IPP或另一個庫的signed int數組,可以在性能方面做一些等同的事情。

但是可能有其他創造性的方法......所以我問你是否有幫助! :)

PS:使用英特爾IPP的優勢在於大型陣列的性能提升:它同時使用多值處理器功能和多個內核(也許還有更多技巧)。所以簡單的環路解決方案不會像快速AFAIK那樣做。

PS2:鏈接,ippiCompare_* doc

回答

1

您可以與PCMPEQD進行比較,然後是PACKUSDW和PACKUSWB。這將是沿東西

#include <emmintrin.h> 

void cmp(__m128d* a, __m128d* b, v16qi* result, unsigned count) { 
    for (unsigned i=0; i < count/16; ++i) { 
     __m128d result0 = _mm_cmpeq_pd(a[0], b[0]); // each line compares 4 integers 
     __m128d result1 = _mm_cmpeq_pd(a[1], b[1]); 
     __m128d result2 = _mm_cmpeq_pd(a[2], b[2]); 
     __m128d result3 = _mm_cmpeq_pd(a[3], b[3]); 
     a += 4; b+= 4; 

     v8hi wresult0 = __builtin_ia32_packssdw(result0, result1); //pack 2*4 integer results into 8 words 
     v8hi wresult1 = __builtin_ia32_packssdw(result0, result1); 

     *result = __builtin_ia32_packsswb(wresult0, wresult1); //pack 2*8 word results into 16 bytes 
     result++; 
    } 
} 

需求保持一致指針,計數被16整除,有些類型轉換我已經因爲lazyness /愚蠢和可能很多,當然調試,漏報。而且我沒有找到packssdw/wb的內在特性,所以我只是使用了我的編譯器中的內建函數。

+0

我現在正在檢查MMX操作,這似乎是完成我的目標的好方法。在這種情況下,我只是不確定多核的使用情況:它看起來不是「自動地」完成的,對嗎? – Chuim 2009-10-19 12:48:15

+0

否。並且由於兩個內核共享資源的一部分,如緩存和內存的最後一級,內存帶寬很可能成爲瓶頸。對於一個如此簡單的例程來說,這可能是不值得的。或者更糟糕的是,表現可能因各種原因而受到影響 – hirschhornsalz 2009-10-19 15:22:22

1

我想有一個SSE指令,將比較整數。你看看可以做到這一點的內在因素嗎?

0

開箱即用:你確定這是一個性能問題嗎?除非您的數據集適合一級緩存,否則您將受到緩存填充限制,並且您在比較操作上花費的實際週期(幾乎不可能是緩慢,即使以最天真的方式完成)也不可能限制。

+0

你是對的,對於純內存操作,內存帶寬通常是限制因素。儘管如此,即使對於簡單的內存拷貝來說,sse指令也會比「天真」的方式或字符串操作更好,即使只有很小的餘地。與簡單的方式相比,只有四分之一的執行單元被佔用,因此超線程可能會從矢量操作中受益。 另外,如果他有流數據以避免高速緩存污染,他可以選擇繞過高速緩存(非暫時性mov指令)。 – hirschhornsalz 2009-10-17 01:56:17

+0

我也會密切關注的;感謝您的建議。無論如何,我們將使用IPP和簡單的標量操作在我們正在構建的每個操作的兩個版本之間運行比較測試,以確保獲得真正的性能提升。 – Chuim 2009-10-19 12:31:12