我打算做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類型寄存器)
我打算做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類型寄存器)
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;
我不知道答案,但你的最後一次迭代寫出來的數組的邊界的for循環 – 2014-10-30 07:09:58
您的原始代碼崩潰(訪問超出數組邊緣)。 修改後的代碼: 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
謝謝Alter和Ermlg超出陣列狀態檢查的邊緣。我更新了我的問題與您的建議。這是我的虛擬代碼,我想寫上述代碼的SSE ..所以我在等待有人回答上證所 – Ashwin 2014-10-30 07:33:25