More Related Content
Similar to Xeonphiハッカソンでexpを作ってみた
Similar to Xeonphiハッカソンでexpを作ってみた (20)
More from MITSUNARI Shigeo
More from MITSUNARI Shigeo (20)
Xeonphiハッカソンでexpを作ってみた
- 4. 作業内容を振り返る
• 既存のベンチマーク
– Phiが載ってるマシン Xeon E5-2620@2GHz
• gcc 4.4.7での比較(clk:小さいほど速い)
• icpc 13.1.3での比較
– Xeon上ではicpcには勝ってる
scalar loop(vector)
std 285 286
fmath 14 8.5
scalar loop(vector)
std 26 9.8
fmath 13.35 7.7
- 7. シャッフルではまる
• x[]の偶数番目だけをy[]に入れる
• x = [...:7:6:5:4:3:2:1:0] → y = [...x4:x2:x0]
• vpermd(_mm512_permutevar_epi32)を使った
– int ptn[16] = { 0, 2, 4, 6, 8, 10, 12, 14 };
– __m512i selEven = (* __m512i*)ptn;
– y = _mm512_permutevar_epi32(selEven, x);
• 引数の順序に注意
• もっとよい方法があるかもしれない(教えてください)
- 9. シフト
• 64bit単位でのシフト命令を探す
– ない
– ない
– 32bit単位のシフトしかない
• ええ??
– 32bit単位でシフトしてorしてエミュレート?
– x=[H:L], x >>= s
• H >>= s, L >>= s, H = (H << (32-s)) >> 32
– byte単位のシフトもない
- 10. 32bit左シフト
• 時間がないので先程のvpermdを使った
– もっとよい方法があれば(略
__m512i shl32bit(__m512i x) {
static const MIE_ALIGN(64) int m[16] = {
0, 0, 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, 0, 12, 0, 14
};
static const __m512i y = *(__m512i*)m;
__m512i zero = _mm512_setzero_epi32();
return _mm512_mask_permutevar_epi32(zero,0xaaaa,y,x);
}