2015-04-03 90 views
1

我在我的程序中有一個算法可以正常工作。我推測是否有可能加速思考一下:在C++ Array尋找短值快速SIMD版本

unsigned short c; 
bool found = false; 
unsigned short* arrIterator = arr; 
while((c = *arrIterator & mask) != stopValue) 
{  
    if(c == next) 
    {    
     found= true; 
     break;     
    } 
    arrIterator ++; 
} 

有可能將這樣的算法改寫成SIMD指令嗎?

+0

您可以先將編譯器配置爲高優化級別嗎?然後您應該打印彙編語言以查看編譯器是否生成了SIMD指令。 – 2015-04-03 19:34:13

+0

另外,嘗試使用數組符號而不是指針。通常,指針只指向一個值。一個數組表示有多個值並且這些值是連續的。 – 2015-04-03 19:35:25

+0

您能保證包含停止值的對齊的16字節塊在停止值之後的值不等於'next' *嗎? – harold 2015-04-03 19:40:00

回答

2

假設arr是16對齊(讓它如此),你可以做這樣的事情(未測試)

__m128i vstop = _mm_set1_epi16(stopValue); 
__m128i vnext = _mm_set1_epi16(next); 
int found_mask = 0; 
int stop_mask = 0; 
do 
{ 
    __m128i data = _mm_load_si128(arrIterator++); 
    __m128i contains_next = _mm_cmpeq_epi16(data, vnext); 
    __m128i contains_stop = _mm_cmpeq_epi16(data, vstop); 
    found_mask = _mm_movemask_epi8(contains_next); 
    stopmask = found_mask | _mm_movemask_epi8(contains_stop); 
} while (stopmask == 0); 

您可以然後說出next被做了bitscan在found_mask發現指數和一些與迭代器的當前值有關的東西。