2011-03-27 76 views
3

我使用VC++創建的應用程序,並希望通過矢量化一些操作,以探索優化opprtunity。未處理的異常使用固有

首先,我想下面的代碼開頭:

__m128i p1; 

p1.m128i_u32[0] = 1; 
p1.m128i_u32[1] = 2; 
p1.m128i_u32[2] = 3; 
p1.m128i_u32[3] = 4; 

__m128i p2; 

p2.m128i_u32[0] = 1; 
p2.m128i_u32[1] = 2; 
p2.m128i_u32[2] = 3; 
p2.m128i_u32[3] = 4; 

__m128i res2= _mm_mul_epi32(p1,p2); 

但是,我得到未處理的異常或非法操作錯誤執行_mm_mul_epi32的時候,我不知道爲什麼它會發生。 有人能告訴什麼是錯的?

+0

嘗試在示例中使用的MSDN頁面上的值,而不是1,2,3,4:http://msdn.microsoft.com/en-us/library/bb514039.aspx – trojanfoe 2011-03-27 20:54:42

+1

這一點很重要對於我們來說,當你完成測試後你會接受答案,好嗎?謝謝。 – karlphillip 2011-03-27 21:07:22

回答

3

_mm_mul_epi32映射到PMULDQ指令,該指令僅在SSE4和AVX中可用。爲了擁有SSE4或AVX,您需要有一個合理的近期英特爾CPU。 Nehalem,Sandy Bridge(Core i5,i7)。

另請注意,您可能會發現使用內在函數初始化SIMD向量可能會更容易,更簡潔。

__m128i p1 = _mm_set_epi32(1, 2, 3, 4); 
__m128i p2 = _mm_set_epi32(1, 2, 3, 4); 
__m128i res2 = _mm_mul_epi32(p1, p2); 
+0

呃我的壞..下載軟件http://www.cpuid.com/,發現我的CPU只有「MMX,SSE(1,2,3 ,3S),EM64T」 – paseena 2011-03-27 21:21:22

+0

Heheh,好一個@保羅。 – karlphillip 2011-03-27 21:24:09

1

你不是應該使用成員m128i_i32而不是m128i_u32

該指令將兩組32位有符號整數相乘。

MSDN

如果你真的需要m128i_u32則必須使用_mm_mul_epu32()代替。

+0

@fruit_trader更新答案几分鐘前。它對你有用嗎? – karlphillip 2011-03-27 21:08:09

+0

在這種情況下,是否使用'm128i_i32'或'm128i_u32'沒有區別,所以這可能不是一個有用的答案。 – 2011-03-27 21:13:45

+0

感謝您的回覆。我錯過了檢查我的CPU - 它沒有SSE4 – paseena 2011-03-27 21:22:18