2 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用英特爾 SVML
我沒有numexpr使用英特爾 SVML,但numexpr使用 SVML 應(yīng)該和 Numba 一樣好。該Numba基準(zhǔn)測(cè)試表明無SVML完全一樣的行為,但SVML更好的表現(xiàn)。
代碼
import numpy as np
import numba as nb
myarr = np.random.uniform(-1,1,[1100,1100])
@nb.njit(error_model="numpy",parallel=True)
def func(arr,div):
return np.exp( - 0.5 * (myarr / div)**2 )
時(shí)間安排
#Core i7 4771
#Windows 7 x64
#Anaconda Python 3.5.5
#Numba 0.41 (compilation overhead excluded)
func(myarr,0.1) -> 3.6ms
func(myarr,0.001) -> 3.8ms
#Numba (set NUMBA_DISABLE_INTEL_SVML=1), parallel=True
func(myarr,0.1) -> 5.19ms
func(myarr,0.001) -> 12.0ms
#Numba (set NUMBA_DISABLE_INTEL_SVML=1), parallel=False
func(myarr,0.1) -> 16.7ms
func(myarr,0.001) -> 63.2ms
#Numpy (1.13.3), set OMP_NUM_THREADS=4
np.exp( - 0.5 * (myarr / 0.001)**2 ) -> 70.82ms
np.exp( - 0.5 * (myarr / 0.1)**2 ) -> 12.58ms
#Numpy (1.13.3), set OMP_NUM_THREADS=1
np.exp( - 0.5 * (myarr / 0.001)**2 ) -> 189.4ms
np.exp( - 0.5 * (myarr / 0.1)**2 ) -> 17.4ms
#Numexpr (2.6.8), no SVML, parallel
ne.evaluate("exp( - 0.5 * (myarr / 0.001)**2 )") ->17.2ms
ne.evaluate("exp( - 0.5 * (myarr / 0.1)**2 )") ->4.38ms
#Numexpr (2.6.8), no SVML, single threaded
ne.evaluate("exp( - 0.5 * (myarr / 0.001)**2 )") ->50.85ms
ne.evaluate("exp( - 0.5 * (myarr / 0.1)**2 )") ->13.9ms

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
這可能會(huì)產(chǎn)生減慢計(jì)算速度的非規(guī)范化數(shù)字。
您可能想使用daz庫禁用非規(guī)范化數(shù)字:
import daz
daz.set_daz()
更多信息:x87 和 SSE 浮點(diǎn)輔助 IA-32:Flush-To-Zero (FTZ) 和 Denormals-Are-Zero (DAZ):
為避免由于非正規(guī)數(shù)和下溢數(shù)引起的序列化和性能問題,請(qǐng)使用 SSE 和 SSE2 指令在硬件中設(shè)置刷新為零和非正規(guī)數(shù)為零模式,以實(shí)現(xiàn)浮點(diǎn)應(yīng)用程序的最高性能。
請(qǐng)注意,在 64 位模式浮點(diǎn)計(jì)算中使用 SSE 指令,而不是 x87。
添加回答
舉報(bào)