2015-05-13 52 views
6

我正在瀏覽AVX-512中的指令集,並注意到一組fixup指令。一些examples「固定」浮動物的含義是什麼?

_mm512_fixupimm_pd, 
_mm512_mask_fixupimm_pd, 
_mm512_maskz_fixupimm_pd 

_mm512_fixupimm_round_pd, 
_mm512_mask_fixupimm_round_pd, 
_mm512_maskz_fixupimm_round_pd 

這是什麼意思這裏的「修理」?

回答

4

這是一個很好的問題。英特爾的答案(我的粗體)是在這裏:

該指令是專門用於使用固定了 得到的結果涉及一個來源,使他們 符合規範的算術計算的,雖然它是固定了一般有用多指令序列的 結果反映特殊數字 輸入。例如,考慮rcp(0)。 輸入0到rcp,你應該得到 根據DX10規範獲取INF。但是,通過 評估rcp Newton-Raphson,其中x =大約(1/0),產生不正確的結果。至 處理此問題,VFIXUPIMMPS可以在N-R倒數 序列之後使用,以將結果設置爲正確的值(即,當 輸入爲0時的INF)。

查找VFIXUPIMMPD在:

https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf

+0

這是一個很多比他們的在線文檔更詳細的,感謝您的參考! –

+0

如果你問我,這仍然是一個非常垃圾的手冊。不符合正常的寫作質量。如果我有一個CPU支持AVX-512我給它一個去看看到底發生了什麼;) – JCx

+1

@JCx:我想它做什麼,是不夠詳細(的'Operation'部分)的僞代碼描述。你引用的段落只是給你用例,而不是操作細節。總結:對於每個src元素,將其分類爲八個「標記」類型之一。使用該標記在第三個操作數(這是一個包含八個4位代碼的表格)的相應元素中查找操作。該動作可以設置dest = dest,dest = src,dest = NaN,dest = +/- Inf,dest = +/- 0,dest = pi/2或其他一些東西。請注意,dest也是一個輸入操作數,即使沒有寫屏蔽也是如此。 –

2

英特爾的描述,他們"future extensions" instruction set reference manual有通常Operation部分充分指定哪些位就去哪裏。

Intrinsics Guide也重現了Operation部分,這與內部指南中其他一些記錄不完善的條目有很大不同。或者,也許這是最近的增加。它仍然留下了表格和圖表。我通常會發現insn ref手冊更有用,除了有時在尋找我可能沒有想到或不知道的指示時。

,此指令的操作部分是漫長而艱難的神交,與英文文本描述只是一個粗略的總結:

執行雙精度 浮動編碼四字元素的固定式(第二個操作數) 使用在第二個源操作數(第三個操作數)的相應 四字元素中指定的32位,兩級查找表與 異常報告說明符imm8

...

兩級查找表通過將輸入數據編碼解碼爲令牌類型來執行第一個源操作數中的每個DP FP輸入數據 的修復。爲每個令牌類型定義一個響應表, 將第一個源操作數中的輸入編碼轉換爲16 響應操作之一。

預期的用例是:rcppd(或類似)+牛頓 - 拉夫遜迭代

  • SRC =輸入到近似+細化
  • 表=修正的

    • DEST =結果表。可以是一個廣播內存操作數,所以在普通情況下只需要64或32位內存,您需要爲矢量的每個元素使用相同的表格。 (該表僅32B爲單精度和雙精度,但DP版本的播放選項m64bcst這是確定了的,上部32位是垃圾,但不爲它跨越頁邊界進入未映射頁:將大概故障)

    或許是爲了彌補這一非常粗糙摘要和全文僞之間的差距更詳細的英文說明是有用的:

    對於每個src元素:

    • tsrc =如果設置了MXCSR.DAZ,則將非規範刷新爲零。原來的src在此之後根本不使用:沒有dest=src動作,只有dest=tsrc

    • tsrc分類爲八種「令牌」類型(QNAN,SNAN,零,+1,-Inf,+ Inf,負值,正值)之一。如果imm8不爲零,則會在找到匹配類型的令牌時觸發異常。

    • 使用該類別的令牌在第三操作數的相應的元素(其是8個4位代碼,一個用於每個令牌的表)中查找的動作。

    • 該操作可以是dest = dest,dest = tsrc,dest = NaN,dest = +/- Inf,dest = Inf中的一個,其符號爲tsrc,dest = +/- 0,dest = +/-1,dest = 1/2,dest = 90.0,dest = pi/2或dest = MAX/MIN_FLOAT。請參閱英特爾的文檔,瞭解哪些代碼映射到哪個操作。

    該過程針對每個向量元素單獨完成。

    一個典型的應用會把dest=dest代碼的所有情況下,我們在解決了結果就已經是正確的。需要注意的是dest也是輸入操作數,即使沒有寫屏蔽,因爲dest=dest作用。