2013-03-09 82 views
1

我必須完成以下使用MIC的512位向量單位:ZGEMM英特爾的MIC

M->|b4|a4|b3|a3|b2|a2|b1|a1| 
I->|d4|c4|d3|c3|d2|c2|d1|c1| 

O-> O + |a4d4+b4c4|a4c4-b4d4|a3d3+b3c3|a3c3-b3d3|a2d2+b2c2|a2c2-b2d2|a1d1+b1c1|a1c1-b1d1| 

我想的是,類似於英特爾已經提出了SSE以及與AVX太工作的方法:

使用_mm512_swizzle_pd()功能以形成:

M0 = | A4 | A4 | A3 | A3 | A2 | A2 | A1 | A1 |和m0_t = | b4 | b4 | b3 | b3 | b2 | b2 | b1 | b1 | in0 = | d4 | c4 | d3 | c3 | d2 | c2 | d1 | c1 | in0_r = | c4 | d4 | c3 | d3 | c2 | d2 | c1 | d1 |

乘以上兩者並使用類似於用於MIC的addsub_pd()。但似乎並沒有相應的內在因素。

有關我如何實現這一目標的任何建議?

英特爾的MIC(至強融核)也有幾個FMA內在像FMADD,fmsub,fnmadd,fnmsub應該借給自己這種情況,我有以下兩種方法:

'O' is the output register 
Approach 1 : 
1. _mm512_fmadd_pd(m0,in0,O); 
2. Explicitly set m0_t using _mm512_set_pd() to make it: |b4|-b4|b3|-b3|b3|-b3|b1|-b1| 
3. _mm512_fmadd_pd(m0_r,in0_r,O); 

Approach 2: 
1. _mm512_fmadd_pd(m0,in0,O); 
2. _mm512_mask_fmadd_pd(m0_r,k1,in0_r,O); with k1=10101010 
3. _mm512_mask_fnmadd_pd(m0_r,k2,in0_r,O); with k2=01010101 

是否有更好的辦法?這些方法的任何錯誤?

回答

1
tmp = _mm512_mul_pd(mo_t,in_r); 
tmp = _mm512_mask3_fmadd_pd(m0,in0,tmp,k1); with k1=10101010 
res = _mm512_mask3_fmsub_pd(m0,in0,tmp,k2); with k2=01010101 

爲什麼要使用_mm512_fnmadd_pd(v1,v2,v3)? 此內在函數的輸出是(〜(v1 * v2)) - v3

+0

是不是_mm512_fnmsub_pd()? 「在float64向量v1和float64向量v2之間執行逐元素乘法,然後否定結果並減去float64向量v3」 – user1715122 2013-03-12 02:11:27

+0

除了上面的註釋之外,是否可以從M形成m0和m0_t。我是考慮使用_mm512_swizzle_pd(),但我認爲這不會起作用。有任何想法嗎? – user1715122 2013-03-12 03:42:06

+0

permute + blend – user1584773 2013-03-13 08:57:35