2014-10-30 15 views
-1

我打算做SSE編碼以下邏輯可能性使用SSE的用於提及邏輯

int num[10]= {0,255,255,255,255,255,255,255,255,255}; 
for (int i =0;i<9;i++){  
     num[i+1]=num[i]<<1;  
} 

是否有可能做SSE實施上述邏輯爲num [I + 1]是依賴於NUM [I]

(AM計劃使用__m128i類型寄存器)

+2

我不知道答案,但你的最後一次迭代寫出來的數組的邊界的for循環 – 2014-10-30 07:09:58

+1

您的原始代碼崩潰(訪問超出數組邊緣)。 修改後的代碼: int num [11] = {0,255,255,255,255,255,255,255,255,255}; (int i = 0; i <10; i ++) num [i + 1] = num [i] << 1; std :: cout << num [i + 1] << std :: endl; } 打印0 0 0 0 0 0 0 0 0 0. – ErmIg 2014-10-30 07:28:33

+0

謝謝Alter和Ermlg超出陣列狀態檢查的邊緣。我更新了我的問題與您的建議。這是我的虛擬代碼,我想寫上述代碼的SSE ..所以我在等待有人回答上證所 – Ashwin 2014-10-30 07:33:25

回答

-1

SSE操作針對向量的每個元素獨立地執行。如果它們之間存在依賴關係,那麼我們有順序算法,使用SIMD CPU指令無法有效執行。

實施例:

const int first = 0;//1; 
int num[10]= {first,255,255,255,255,255,255,255,255,255}; 
for (int i = 0 ; i < 9; i++) 
{  
    num[i + 1] = num[i] << 1;  
    std::cout << num[i + 1] << " "; 
} 

打印0 0 0 0 0 0 0 0 0(第一= 0); 打印2 4 8 16 32 64 128 256 512(第一個= 1)。 結果數組中的所有元素都取決於第一個元素。

有一個SSE實現,但我認爲它不具有任何實際意義:

const int first = 1; 
int num[10]= {first, 255,255,255,255,255,255,255,255,255}; 
int i = 0; 
for (i = 0 ; i < 4; i++) 
    num[i + 1] = num[i] << 1; 
for (; i < 8; i += 4) 
{ 
    __m128i v = _mm_loadu_si128((__m128i*)(num + i - 4 + 1)); 
    v = _mm_slli_epi32(v, 4); 
    _mm_storeu_si128((__m128i*)(num + i + 1), v); 
} 
for (; i < 9; ++i) 
    num[i + 1] = num[i] << 1; 
+0

我想知道,對於上述邏輯SSE實現是可能的?如果是的話,如果沒有,那麼爲什麼! – Ashwin 2014-10-30 08:50:34

+2

@Ashwin,他的回答不會比你的問題更無用。你應該接受Paul R的建議,並用一些有意義的事情來更新你的問題。 – 2014-10-30 09:00:47

+0

@ Zboson,正如我在回覆PaulR時所提到的,我將在這裏重寫它:我不能在這裏寫出完整的代碼(協議問題的原因),但是我發佈的是與我的應用程序類似的虛擬代碼。我的代碼在哪裏檢查幀/圖像中的對象。 – Ashwin 2014-10-30 09:03:05