2014-02-17 98 views
2

我想手動管理我的代碼是對MIC的SIMD操作,並寫出下面的內在函數通過內部函數或指令

_k_mask = _mm512_int2mask(0x7ff); // 0000 0111 1111 1111 
_tempux2_512 = _mm512_mask_loadunpacklo_ps(_tempux2_512,_k_mask, &u_x[POSITION_INDEX_X(k,j,i-5)]); 
_tempux2_512 = _mm512_mask_loadunpackhi_ps(_tempux2_512,_k_mask, &u_x[POSITION_INDEX_X(k,j,i-5)]+16); 

,編譯器ICPC給出了這些錯誤消息,手動控制英特爾MIC SIMD操作。

test.cpp:574: undefined reference to `_mm512_mask_extloadunpacklo_ps' 
test.cpp:575: undefined reference to `_mm512_mask_extloadunpackhi_ps' 

一切都會好的編譯如果我使用_mm512_mask_load_ps,但我的內存不能爲64字節對齊,以便使用_mm512_mask_load_ps將導致運行錯誤。

然後我試着寫了內聯彙編塊手動像這樣

MOV rax,0x7ff 
KMOV k1,rax 
VMOVAPS zmm1 {k1}, [data_512_1] 
VMOVAPS zmm2 {k1}, [data_512_2] 
VMULPS zmm3 {k1}, zmm2 zmm1 
VMOVAPS [data_512_3] {k1}, zmm3 

,編譯器ICPC顯示錯誤再次

test_simd.cpp(30): (col. 10) error: Unknown opcode KMOV in asm instruction . 
test_simd.cpp(33): (col. 10) error: Syntax error ZMM1 in asm instruction vmulps. 

我是彙編語言的初學者,這將是非常感謝如果有人能告訴我爲什麼icpc沒有找到參考和如何解決它,或者可以向我推薦一些材料。 (我已閱讀英特爾®至強融核™協處理器指令集體系結構參考手冊,但仍不知如何編寫。)

非常感謝。

+0

請確保您使用'-mmic'選項編譯 –

回答

3

看來您的目標是AVX-512指令集,該指令集將在未來的桌面處理器和Xeon Phi協處理器中實現。目前這代Xeon Phi使用不同的指令集,通常稱爲KNCNIK1OM,與AVX-512類似但不兼容(特別是,AVX-512支持未對齊的加載指令,而KNCNI建議使用一對load-unpack-lo +加載 - 解壓 - 嗨指令爲同一目的)。要編譯KNCNI,您應該使用英特爾編譯器的-mmic選項(將其視爲-m64選項的替代選項,這會使編譯器的目標爲x86-64 ISA:生成的代碼不會在普通的x86-64處理器上運行,反之亦然)。 AFAIK AVX-512集尚未在英特爾編譯器的公開發行版中得到支持,但很可能會使用新的-x選項。

+0

感謝您的回覆。我想要使​​用麥克風卸載模塊,即。程序在cpu上運行,但某些部分在協處理器上運行,_mm512_mask_loadunpacklo_ps應該是您提到的指令的ntrinsics。有什麼方法可以正確編譯它嗎?我需要在cpu上運行的程序.... http://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/index.htm#GUID-21A7AB61-DE84- 410A-8211-ADE9533FACE1.htm – user3317622

+0

然後,只有在定義了__MIC__時,才應該使用Xeon Phi內部函數 –

+0

非常感謝!我想使用#ifndef __MIC__,但在我的文件中它是#ifdef __MIC__。非常感謝!! – user3317622