亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Numpy 性能差異取決于數值

Numpy 性能差異取決于數值

UYOU 2021-08-24 17:00:06
在評估 Numpy 中的表達式時,我發現了一個奇怪的性能差異。我執行了以下代碼:import numpy as npmyarr = np.random.uniform(-1,1,[1100,1100])然后%timeit np.exp( - 0.5 * (myarr / 0.001)**2 )>> 184 ms ± 301 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)和%timeit np.exp( - 0.5 * (myarr / 0.1)**2 )>> 12.3 ms ± 34.3 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)在第二種情況下,計算速度快了近 15 倍!請注意,唯一的區別是因子為 0.1 或 0.001。這種行為的原因是什么?我可以更改某些內容以使第一次計算與第二次計算一樣快嗎?
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

使用英特爾 SVML

我沒有numexpr使用英特爾 SVML,但numexpr使用 SVML 應該和 Numba 一樣好。該Numba基準測試表明無SVML完全一樣的行為,但SVML更好的表現。


代碼


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 )

時間安排


#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


查看完整回答
反對 回復 2021-08-24
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

這可能會產生減慢計算速度的非規范化數字。


您可能想使用daz庫禁用非規范化數字:


import daz

daz.set_daz()

更多信息:x87 和 SSE 浮點輔助 IA-32:Flush-To-Zero (FTZ) 和 Denormals-Are-Zero (DAZ):


為避免由于非正規數和下溢數引起的序列化和性能問題,請使用 SSE 和 SSE2 指令在硬件中設置刷新為零和非正規數為零模式,以實現浮點應用程序的最高性能。


請注意,在 64 位模式浮點計算中使用 SSE 指令,而不是 x87。


查看完整回答
反對 回復 2021-08-24
  • 2 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號