ãã®èª¿æ»ã¯ãscipy CIãéå»æ°æ¥éãã€ãŸã1.14ããªãªãŒã¹ãããåŸãã¢ãã€ã€ãŒã§
ç§ã®èªå® ã®ã³ã³ãã¥ãŒã¿ãŒïŒmacOSãconda python 3.6.2ãconda numpyïŒïŒ
>>> import numpy as np
>>> np.version.version
'1.14.0'
>>> np.min([1.0, 2.0, np.nan])
nan
>>> np.min([1.0, np.nan, 2.0])
nan
>>> np.min([np.nan, 1.0, 2.0])
nan
>>> np.min([np.nan, 1.0])
/Users/andrew/miniconda3/envs/dev3/lib/python3.6/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
return umr_minimum(a, axis, None, out, keepdims)
nan
ç§ã®ä»äºçšã³ã³ãã¥ãŒã¿ãŒïŒmacOSãconda python 3.6.2ãã¯ãªãŒã³ãªç°å¢ã§pipãä»ããŠã€ã³ã¹ããŒã«ãããnumpyïŒïŒ
>>> import numpy as np
>>> np.version.version
'1.14.0'
>>> np.min([1., 2., 3., 4., np.nan])
nan
>>> np.min([1., 2., 3., np.nan, 4.])
nan
>>> np.min([1., 2., np.nan, 3., 4.])
nan
>>> np.min([1., np.nan, 2., 3., 4.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
>>> np.min([np.nan, 1.])
nan
>>> np.min([np.nan, 1., np.nan])
nan
>>> np.min([1., np.nan])
nan
>>> np.seterr(all='raise')
{'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
>>> np.min([1., np.nan])
nan
>>> np.min([np.nan, 1.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
ã³ãŒãäŸã®æåã®ã»ããã§ãæåã®3ã€ã®äŸãèŠåã衚瀺ãããæåŸã®äŸã ãã衚瀺ãããã®ã¯ãªãã§ããïŒ
2çªç®ã®äŸã§ã¯ãèŠåã¯ãŸã£ããçºçããŸããã
xref scipy / scipyïŒ8282ãscipy / scipyïŒ8279
ããã§ã®ãã1ã€ã®ãã€ã³ãã¯ãããšãã°AVXãªã©ã䜿çšããŠããããã«ãç°ãªãïŒå®éã«ã¯åä»ã§ã¯ãªããšæãïŒåäœãããªã¬ãŒããã®ã¯ç°ãªãã³ãŒããã¹ã§ããå¯èœæ§ãããããšã§ãããã¯ã¿ãŒã®ãã®ããšã©ãŒCPUãã©ã°ãèšå®ã§ããªãã£ãããšãæã èŠããããšæããŸãããããã䜿çšãããŠãããã©ããã«ããããããããã¯å°ãã©ã³ãã ã«èŠããå¯èœæ§ãããããã§ãã
ããããããšå€§ãã«é¢ä¿ãããã®ãªããDunnoã§ãããç§ã¯ãããæåŸ ããŠããŸããnumpyã¯éåžžæµ®åå°æ°ç¹ãšã©ãŒã«ã€ããŠããŸãå€ãã®ããšãããªããšæããŸãã äœããèµ·ãã£ããã©ããããã§ãã¯ããããšãé€ããŠã
ãããŠãã£ãã¯ãèšã£ãããã«ããã®æµ®åå°æ°ç¹ãšã©ãŒãã©ã°ã®å€ãã¯æ®å¿µãªããã·ã¹ãã ã«ãã£ãŠç°ãªããŸãã
ããããŸããããšã©ãŒãäžéšã®ã€ã³ã¹ããŒã«ã§ã®ã¿çºçããä»ã®ã€ã³ã¹ããŒã«ã§ã¯çºçããªãçç±ãç解ããŸããã
scipyãNaNãå«ãå¯èœæ§ã®ããé
åã§np.minã䜿çšããŠããçç±ã¯ãNaNã®ååšããã°ãããã§ãã¯ããæ¹æ³ã ããã§ãã numpyã®ããã¥ã¡ã³ãã¯ãããã蚱容ãããããšã瀺åããŠããŸãã
NaNå€ãäŒæãããŸããã€ãŸããå°ãªããšã1ã€ã®ã¢ã€ãã ãNaNã®å Žåã察å¿ããæå°å€ãNaNã«ãªããŸãã
ãããnp.minã®èš±å¯ããããŠãŒã¹ã±ãŒã¹ã®1ã€ã§ããããšãèãããšã䜿çšã®èŠ³ç¹ããã¯ãèŠå/ãšã©ãŒãçºçããããšã¯ãŸã£ãããªããšæããŸãã
ïŒãããéæããæ¹æ³ã¯æããã«ä»ã«ããããŸããããšãã°ã np.isnan(arr).any()
ã§ãããäžèšã®çç±ã¯å€ãããŸããïŒ
ãã£ãšããããå€åã§ã¯ãªããšæããŸãã
èŠåããŸã£ãããªãå Žåã¯+1
ããã«ã¡ã¯ã
ç§ã¯åæ§ã®ççŸã«ééããŸããïŒ
>>> import numpy
>>> import warnings
>>> warnings.simplefilter("always", category=RuntimeWarning)
>>> numpy.min(numpy.full((7,), numpy.nan, dtype=numpy.float64))
nan
>>> numpy.min(numpy.full((8,), numpy.nan, dtype=numpy.float64))
/home/user/env/lib/python3.6/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
return umr_minimum(a, axis, None, out, keepdims)
nan
圢ç¶ã8ãè¶ ãããšãRuntimeWarningãçºçããã®ã¯ãªãã§ããïŒ
@NotSqrt @sebergå ¥åé åã®ãµã€ãºããµã€ãº8ã«
> cat np-min-wat.py
import numpy as np
print "numpy version:", np.__version__
print ""
def show_min(input):
print ""
arr = np.array(input)
print arr.dtype, arr
print "this should be nan as per docs:", arr.min()
arr = np.array
input = [31., 487., np.nan, 10000., 10000., 19., 101., 22., 1000., 300., 10.]
for x in xrange(3, len(input) + 1):
show_min(input[0:x])
OSXãšWindowsã§ãã®ããªãå¥åŠãªåäœã瀺ããŸãããLinuxã§ã¯ç€ºããŸãããpython2.7.13ãšnumpy1.14.2ã䜿çšããæ°ããvirtualenvïŒ
numpy version: 1.14.2
/Users/kip/ac/Environments/test/lib/python2.7/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
return umr_minimum(a, axis, None, out, keepdims)
float64 [ 31. 487. nan]
this should be nan as per docs: nan
float64 [ 31. 487. nan 10000.]
this should be nan as per docs: nan
float64 [ 31. 487. nan 10000. 10000.]
this should be nan as per docs: nan
float64 [ 31. 487. nan 10000. 10000. 19.]
this should be nan as per docs: nan
float64 [ 31. 487. nan 10000. 10000. 19. 101.]
this should be nan as per docs: nan
float64 [ 31. 487. nan 10000. 10000. 19. 101. 22.]
this should be nan as per docs: 19.0
float64 [ 31. 487. nan 10000. 10000. 19. 101. 22. 1000.]
this should be nan as per docs: 19.0
float64 [ 31. 487. nan 10000. 10000. 19. 101. 22. 1000. 300.]
this should be nan as per docs: nan
float64 [ 31. 487. nan 10000. 10000. 19. 101. 22. 1000. 300.
10.]
this should be nan as per docs: nan
ããã«ãã2ã€ã®ãããã¯ããã¥ã¡ã³ãã«åŸã£ãŠnanã§ããå¿ èŠããããŸãïŒ 19.0 ãè¡ãåç §ããŠãã ããã
ãŸããnbèŠåã¯numpy 1.13.1ïŒç§ãæåã«ãã®åäœã芳å¯ããå ŽæïŒã«ã¯è¡šç€ºãããŸããã
@kippr NumPyã¯ã©ãã§å ¥æããŸãããïŒ
8ã€ã®èŠçŽ ã®å¢çãAVX512ã«é¢é£ããŠããå¯èœæ§ããããåé¡ã¯ã³ã³ãã€ã©ãšCPUã®çµã¿åããã«ãããšæšæž¬ããŸãã ã©ã®CPU /ã³ã³ãã€ã©ã§åé¡ãçºçããŠããŸããïŒ
@juliantaylorèãïŒ
ã¢ã©ã€ã¡ã³ãã圱é¿ããŠããå¯èœæ§ããããŸãã
ããã«ã¡ã¯@charris
ç§ã®æçš¿ãèŠãŠãããŠããããšã..ããªãã®è³ªåã«çããããã«ïŒ
CPU ïŒ
âsysctl-nmachdep.cpu.brand_stringIntelïŒRïŒCoreïŒTMïŒi7-6700K CPU @ 4.00GHz
NumPyã¯æ°ããvirtualenvïŒhomebrewãä»ããŠã€ã³ã¹ããŒã«ãããpython 2.7.13ïŒã®Macã®pipãä»ããŠã€ã³ã¹ããŒã«ãããã®ã§ããã¹ãŠã®ããã©ã«ãã®ã³ã³ãã€ã©ãã©ã°ãªã©ã䜿çšããŠãããšæããŸããïŒ
ä»®æ³envãåäœæããpip installãåå®è¡ããŸããããããç§ã«é¢ä¿ããããã«èŠããŸãããã€ã³ã¹ããŒã«æã«å±ãã¡ãã»ãŒãžããããããããŸããïŒå®å šãªãã°ãæ·»ä»ãããŠããŸããïŒä»ã®æ å ±ãããã°æããŠãã ããããã«ããã£ã¬ã¯ããªãªã©ããé£ãäžããããšãã§ããŸãããŸãã¯ãã³ã³ãã€ã«ãã©ã°ãããå Žåã¯è©ŠããŠã¿ãŠãã ããã
[..]
Downloading numpy-1.14.2.zip (4.9MB):
Downloading from URL https://pypi.python.org/packages/0b/66/86185402ee2d55865c675c06a5cfef742e39f4635a4ce1b1aefd20711c13/numpy-1.14.2.zip#md5=080f01a19707cf467393e426382c7619 (from https://pypi.python.org/simple/numpy/)
...Downloading numpy-1.14.2.zip (4.9MB): 4.9MB downloaded
[..]
building library "npymath" sources
get_default_fcompiler: matching types: '['gnu95', 'nag', 'absoft', 'ibm', 'intel', 'gnu', 'g95', 'pg']'
customize Gnu95FCompiler
Found executable /usr/local/bin/gfortran
customize Gnu95FCompiler
customize Gnu95FCompiler using config
C compiler: clang -fno-strict-aliasing -fno-common -dynamic -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
compile options: '-Inumpy/core/src/private -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
clang: _configtest.c
clang _configtest.o -o _configtest
success!
removing: _configtest.c _configtest.o _configtest
ããããšã
ã¯ãªã¹
Psã¯ããããé©ãããšã§ã¯ãããŸããããmaxã§ãåãåäœãèŠãããŸãã
numpy version: 1.14.2
arr.dtype, arr: float64 [ 31. 487. nan]
/Users/kip/ac/Environments/meh/lib/python2.7/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
return umr_minimum(a, axis, None, out, keepdims)
arr.min(): nan
/Users/kip/ac/Environments/meh/lib/python2.7/site-packages/numpy/core/_methods.py:26: RuntimeWarning: invalid value encountered in reduce
return umr_maximum(a, axis, None, out, keepdims)
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0
arr.dtype, arr: float64 [ 31. 487. nan 10000.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000. 19.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000. 19. 101.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000. 19. 101. 22.]
arr.min(): 19.0
arr.max(): 10000.0
np.amin(arr): 19.0
np.nanmin(arr): 19.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000. 19. 101. 22. 1000.]
arr.min(): 19.0
arr.max(): 10000.0
np.amin(arr): 19.0
np.nanmin(arr): 19.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000. 19. 101. 22. 1000. 300.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0
arr.dtype, arr: float64 [ 31. 487. nan 10000. 10000. 19. 101. 22. 1000. 300.
10.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 10.0
åãnumpyããŒãžã§ã³ïŒarchäžïŒãAVX2ããã³sse4.2æ©èœãåããCPUã§äœ¿çšããŠããŸãããLinuxã§ã¯è¡šç€ºãããŸããã å€åããã¯mac / clangãšé¢ä¿ããããŸããïŒ
ç·šé/ä¿®æ£:(ç§ã¯ããŸããŸãªé 眮ãèªçºããŠå°ãè©ŠããŸããããèŠåéšåããã§ãã¯ããŸããã§ããããééã£ãçµæéšåã衚瀺ãããŸããïŒ
æ£ããèšå®ãããŠããªãCPUãã©ã°ããããšæããŸããããããã³ã³ãã€ã©ã«é¢é£ããŠããŸãã
ããã远跡ããããã ããªãããã®åé¡ãæããã«ãããã¹ããå¿ èŠã§ãã @kippräœã
np.min(np.diagflat([np.nan]*10), axis=0)
ããªãã®ã€ã³ã¹ããŒã«ã§è¡ããŸããïŒ
ããã«ã¡ã¯@charris
ããã¯å€§äžå€«ã®ããã§ãïŒ
In [1]: import numpy as np
In [2]: np.min(np.diagflat([np.nan]*10), axis=0)
Out[2]: array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
ããããç§ã¯ããã«ããã€ãã®ã³ã³ããè©Šãã次ã®ããšãèŠã€ããŸããïŒæåŸã®1ã€ã8ã€ã®å€ãšaxis = 1ãåç §ïŒïŒ
In [3]: np.min(np.diagflat([np.nan]*10), axis=1)
Out[3]: array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
In [4]: np.min(np.diagflat([np.nan]*8), axis=0)
Out[4]: array([ nan, nan, nan, nan, nan, nan, nan, nan])
In [5]: np.min(np.diagflat([np.nan]*8), axis=1)
Out[5]: array([ nan, nan, 0., 0., nan, 0., nan, nan])
ããªãäžæè°ã§ã..ãããåå ãç解ããã®ã«åœ¹ç«ã€ãã©ããã¯ããããŸããã
@ seberg-ã¯ããããã§ã
ããããšã
ã¯ãªã¹
@kipprããã¯åºæ¬çãªæäœã«åœ±é¿ãåãŒããåé¡ã¯ããããNumPyã«èµ·å ãããã®ã§ã¯ãªãããã«æããããããéåžžã«
NumPyã«ã¯ã1.14ã§ãã®åäœãå€æŽãããã®ã¯äœããããŸããã ãã¶ãOpenBLASã¯ã³ã³ãããŒã«ãããã£ãŠããŸã...
@juliantaylor @VictorRodriguezèãïŒ
ããã«ã¡ã¯@charris
Macã®Python3ã§ããã®åäœãèŠãããŸãã
Python 3.6.0 (default, Jan 23 2017, 20:09:28)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([nan, nan, 0., 0., nan, 0., nan, nan])
>>> np.__version__
'1.14.2'
Nb Macã®python2.7ã§NumPyããŒãžã§ã³1.13ã§ãã®åäœã«æåã«æ°ä»ããã®ã§ã1.14ã§å°å ¥ããããªã°ã¬ãã·ã§ã³ã§ã¯ãããŸããã§ããã
Python 2.7.10 (default, Feb 7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan, nan, 0., 0., nan, 0., nan, nan])
>>> np.__version__
'1.13.1'
ãããŠãããcygwin / windowsã§åçŸããŸããïŒ
$ python
Python 2.7.13 (default, Mar 13 2017, 20:56:15)
[GCC 5.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan, nan, 0., 0., nan, 0., nan, nan])
>>> np.__version__
'1.13.1'
ããããLinuxã§ã¯ãã®åé¡ã¯èŠãããŸããã
Python 2.7.6 (default, Oct 26 2016, 20:32:47)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan, nan, nan, nan, nan, nan, nan, nan])
>>> np.__version__
'1.13.1'
@charris numpyã®ããã©ãŒãã³ã¹æé©åã®æ ã§ãopenblasãšã³ã³ãã€ã©ãã©ã°ãnumpy / scipyã®åäœã«åœ±é¿ãäžããå¯èœæ§ãããããšã確èªããŸããïŒç§ã®çµéšã«åºã¥ãïŒã ç§ãã¡ãåãããšãã§ããæåã®ã¹ãããã¯ãCïŒopenblasã©ã€ãã©ãªã䜿çšïŒãã¹ãã§ããã«åãçµãããšã§ããããã«ãããåäœãåé¢ããŠãè€è£œã§ãããã©ããã確èªã§ããŸãã ãŸãããããMACãšWindowsã ãã«ããããšãå確èªããã ãã§ããïŒ Linuxã§ã¯ãã®åäœãèŠãããšãã§ããŸããïŒavxãããã¯1.15ã§äœ¿çšããããããããã«åœ±é¿ãäžããããšã¯ãããŸããïŒã @kippr Mac / Windowsã§ã©ã®ããã«numpyãæ§ç¯ããŸãããïŒ ãããã
ããã«ã¡ã¯@VictorRodriguez
ããã¯ãäž¡æ¹ã®ãã©ãããã©ãŒã ã§ã®pipã€ã³ã¹ããŒã«ãMacã®å Žåã¯æ°ããvirtualenvãä»ãããã®ã§ããã Python2.7ã€ã³ã¹ããŒã«ã®ã³ã³ãã€ã«åºåãå«ãpipã®ãã°ã貌ãä»ããäžèšãåç §ããŠãã ããã ïŒPython 3 pipã®ã€ã³ã¹ããŒã«ã¯ãã€ãŒã«ã®ããã§ããïŒ
也æ¯ã¯ãªã¹
ããã«ã¡ã¯çãã
ç§ãå©ããããã«æäŸã§ããä»ã®æ
å ±ã¯ãããŸããïŒ
ããããšã
MacïŒããã³ããããä»ã®ãã©ãããã©ãŒã ïŒã§ã¯ãã³ã³ãã€ã©ãŒïŒMacã§ã¯ããã©ã«ãã§gccã§ã¯ãªãclang / llvmïŒãåé¡ã®ããæ¹æ³ã§SSE2ã³ãã³ãã䞊ã¹æ¿ããŠããããããã°ãçºçããŠããŸãã ã®ãã°ïŒ
np.min(np.diagflat([np.nan]*8), axis=1)
å®è¡ãããŠããã³ãŒãã以äžããçæãããsse2_minimum_DOUBLEã§ããããããçºçããŠããŸãã
https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1020
å ·äœçã«ã¯ã1041è¡ç®ã®é¢æ°å ã®ãã®ã³ãŒãïŒSSE2ãã©ãŒã ãèªåæ¡åŒµããŸããïŒãèŠãŠã¿ãŸãããã
}
c1 = _mm_min_pd(c1, c2);
if (npy_get_floatstatus() & NPY_FPE_INVALID) {
*op = NPY_NAN;
}
else {
npy_double tmp = sse2_horizontal_min___m128d(c1);
....
}
ã³ã³ãã€ã©ã¯ãc1å²ãåœãŠãšnpy_get_floatstatusïŒïŒãé¢é£ããŠããããšãç解ããŠããªããããã³ãŒãã次ã®ããã«å€æŽããŸãã
}
if (npy_get_floatstatus() & NPY_FPE_INVALID) {
*op = NPY_NAN;
}
else {
c1 = _mm_min_pd(c1, c2);
npy_double tmp = sse2_horizontal_min___m128d(c1);
....
}
ãã¡ããããã¯æå³ããããŸãã...æé©åã®äžã§ãããè¡ããªãããã«ããããã®æšå¥šãããæ¹æ³ã¯ããããŸããã ïŒä»ã®ãã©ãããã©ãŒã ã«ã¯ããã®ããã®STDC FENV_ACCESSãã©ã°ãããããšæããŸããïŒïŒ
ãã¶ãããã®ã³ãŒãã®å€æŽã¯5幎åã®ãã®ãªã®ã§ããã°ã®åå ã¯æ°ããããŒãžã§ã³ã®clangãšããŸããŸãªæé©åã§ããïŒ
ããããšã@tzickel
ç§ã¯äœã¶æãåã®é«æ ¡ã®ã¯ã©ã¹ä»¥æ¥CãæžããŠããªãã£ãã®ã§ãããã解決ããããã®è³¢ãæ¹æ³ã絶察ã«ç解ããã€ããã¯ãããŸããããã³ã³ãã€ã©ã«å ã®é åºã§è©äŸ¡ãããããã«ããã€ãã®ããšãè©Šã¿ãŸããäžèšã®ifã¹ããŒãã¡ã³ãã次ã®ããã«å€æŽããŸãã
if ((sizeof(c1) != 0) || (sizeof(c1) == 0) & npy_get_floatstatus() & NPY_FPE_INVALID) {
ãããŠç¢ºãã«ãç§ããããè¡ããšããã°ã¯æ¶ããŸãã
ïŒç§ã¯ãŸããã³ã³ãã€ã©ã«ifã¹ããŒãã¡ã³ãã®åã«_mm_min_pdãè©äŸ¡ãããããã«ãä»ã®ããŸã銬鹿ããŠããªããã©ãŒã ãããããè©ŠããŸãããããšãã°ãifã¹ããŒãã¡ã³ãã®äž¡åŽãšif / elseãããã¯ã®åŸã«c1ãžã®åç §ãé 眮ãããã¹ãŠãšã«ãããããã䞊ã¹æ¿ããããåžžã«c = _mm_min_pdå²ãåœãŠãå®è¡ãããããŸãã¯ç§ã®åŒã³åºããå®éã«ã¯äœããã®åœ¢åŒã®ããŒãã§ãããšèããã®ã§ã¯ãªãããšæããŸããïŒ
ãããããããã«ãããç§ãèŠãŠãããã°ãç¹å®ããããšã確èªã§ããŸãã誰ããã³ã³ãã€ã©ã«_mm_min_pdãšnpy_get_floatstatusã®é åºããã®ãŸãŸã«ããŠããããã«ãã³ããäžããè¯ãæ¹æ³ãããããšãé¡ã£ãŠããŸãã
ããŠãã°ãŒã°ã«ãææ¡ãããã1ã€ã®ããšãæ©èœããŸããïŒc1ãæ®çºæ§ã«ããïŒ
ã«ãªããŸãïŒ
/* load the first elements */
@vtype@ volatile c1 = @vpre@_load_@vsuf@((@type@*)&ip[i]);
@vtype@ c2 = @vpre@_load_@vsuf@((@type@*)&ip[i + stride]);
i += 2 * stride;
ãããããããç®æšãéæããããã®æè¯ã®æ¹æ³ã§ãããã©ããããããã©ã®ãããªæå³ãæã€ã®ãã¯ããããŸããã
ãã®@tzickelã®è¿œå ã®ãããã°ã«ã§ããã@ kippr質åããããŸããããã¯Macãžã®æ°ããpipã€ã³ã¹ããŒã«ã§ãããããæåãããã«ãããããšã¯æ³å®ãããŠããŸããã ãŸããgccã䜿çšããŠLinuxã·ã¹ãã ã§å®è¡ããå ŽåïŒ
$ python
Python 3.6.5ïŒããã©ã«ãã2018幎4æ1æ¥ã15ïŒ40ïŒ54ïŒ
Linuxäžã®[GCC7.3.0]
詳现ã«ã€ããŠã¯ããhelpãããcopyrightãããcreditsãããŸãã¯ãlicenseããšå
¥åããŠãã ããã
numpyãnpãšããŠã€ã³ããŒã
np.version.version
ã1.14.2ã
np.minïŒ[1.ã2.ã3.ã4.ãnp.nan]ïŒ
ãã³
np.minïŒ[1.ã2.ã3.ãnp.nanã4ã]ïŒ
ãã³
np.minïŒ[1.ã2.ãnp.nanã3.ã4ã]ïŒ
ãã³
np.minïŒ[1.ãnp.nanã2.ã3.ã4ã]ïŒ
ãã³
np.minïŒ[np.nanã1.ã2.ã3.ã4ã]ïŒ
ãã³
np.minïŒ[np.nanã1ã]ïŒ
ãã³
np.minïŒ[np.nanã1.ãnp.nan]ïŒ
ãã³
np.minïŒ[1.ãnp.nan]ïŒ
ãã³
np.seterrïŒall = 'raise'ïŒ
{'divide'ïŒ 'warn'ã 'over'ïŒ 'warn'ã 'under'ïŒ 'ignore'ã 'invalid'ïŒ 'warn'}
np.minïŒ[np.nanã1.0]ïŒ
ãã³
èŠåã¯ãŸã£ãã衚瀺ãããªãããã説æããããã«ãåé¡ã¯clangã«ããå¯èœæ§ããããŸãã ç§ãäžæè°ã«æãå¯äžã®ããšã¯ããªãããªããpip installnumpyã§ãããèŠãŠããã®ããšããããšã§ãã ã©ã®ããã«æ§ç¯ãããŸãããïŒ ãããŠãã©ã®ãã©ã°ã䜿çšãããŸãããïŒ
ãŸããç§ã®Macã§ããšã©ãŒã¯ãããŸããïŒ
ããã¯æ¬¡ã®ãããªãã®ã§ããå®å šã«ã§ããã®ã ããã
if (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID) {
@juliantaylorèãïŒ
ãããã¯
return_nan = (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID);
if (return_nan) {
ã¹ã¬ããã»ãŒãã§ã¯ãªããããããŸããããã³ã³ãæŒç®åã¯ã·ãŒã±ã³ã¹ãã€ã³ãã§ãããšæ³å®ãããŠããŸãã ããŒããsimdã³ãŒãã®ã©ãã ããã¹ã¬ããã»ãŒããªã®ã ãããã
@ VictorRodriguezpython2.7ã䜿çšããŠMacã§
pip installã®å®å šãªåºåããã£ããã£ããŸããïŒ https ïŒ
äžèšã®å€æŽããã¹ãããããã«ããœãŒã¹ïŒçŸåšã®ãã¹ã¿ãŒïŒãããã«ãããŸãããã埮調æŽãè¡ããªããŠããåäœãå£ããŠããããšã確èªããŸããã ãããæ§ç¯ãããšããINSTALL.rst.txtã§ææ¡ãããã³ãã³ãã©ã€ã³ã䜿çšããŸããïŒ
python setup.py build -j 4 install --prefix $HOME/.local
泚æç¹ãšããŠãããã®èª°ãããWindowsã§ããã°ãèŠããšèšã£ãŠããŸãã Windowsã§ã¯clangã§ã³ã³ãã€ã«ãããŠããªããšæããŸãããMSVCãŸãã¯GCCã§ã¯ãããã¯numpyããã©ãããã©ãŒã ã®ã«ãŒã«ãå°éããŠããªãããšãæå³ããŠããå¯èœæ§ããããŸãã Windowsã§ã¯ãnumpyã¯fpç¶æ ãååŸããããã«_statusfpã䜿çšããMSDNããã¥ã¡ã³ãã«ã¯æ¬¡ã®ããã«èšèŒãããŠããŸãã
å€ãã®æ°åŠã©ã€ãã©ãªé¢æ°ã¯æµ®åå°æ°ç¹ã¹ããŒã¿ã¹ã¯ãŒããå€æŽããäºæž¬ã§ããªãçµæããããããŸãã æé©åã«ããã_status87ã_statusfpãããã³é¢é£ããé¢æ°ã®åŒã³åºãã«é¢ããæµ®åå°æ°ç¹æŒç®ã䞊ã¹æ¿ããçµåããæé€ã§ããŸãã / OdïŒDisableïŒDebugïŒïŒã³ã³ãã€ã©ãªãã·ã§ã³ãŸãã¯fenv_accessãã©ã°ããã£ã¬ã¯ãã£ãã䜿çšããŠãæµ®åå°æ°ç¹æŒç®ã䞊ã¹æ¿ããæé©åãé²ããŸãã
GCCãšMSVCïŒãã ããçŸæç¹ã§ã¯clangã§ã¯ãããŸããïŒã«ã¯ããããå¶åŸ¡ããããã®ãã©ã°ãããããŸãã
@tzickelã¯ãWindowsãã«ããcygwinã§ãããšèšã£ãããšãããªã確信ããŠããŸãã MSVCã§ã¯åçŸã§ããŸããã
å šäœçã«ç§ã¯@charrisã®ææ¡ã奜ã
/* use the comma operator to prevent optimization changing the order of evaluation */
if (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID) {
ããã¯ãPython2.7ã§äœ¿çšãããVisualStudio8ã³ã³ãã€ã©ã§ããµããŒããããŠããŸãã
2çªç®ã®ãããã³ã³ãã¯ããªææ¡ã¯é£èªåãããããŠããããã§ã
ãã®ãã°ã®åœ±é¿ãåããããã³ãŒãå ã®ä»ã®å Žæã¯ãããŸããïŒ
cygwinãã«ãã¯GCCãšèšã£ãŠããŸãããããã¯ãã°ãLinuxã®ããã«åäœããã¯ãã ãšããããšã§ãã
ç§ãæ£ããç解ããŠããã°ãã³ã³ãæŒç®åã¯æé©åã«åœ¹ç«ã¡ãŸãããã³ãŒãçæã®å¥ã®ã¬ãã«ã§æ©èœããŸãã ã³ã³ãã€ã©ãŒã¯ãäž¡æ¹ã®åŒãç¡é¢ä¿ã§ãããšèããŠããããã移åããããšãã§ããŸãã ãããäºå®ã§ããããšã瀺ãå°ããªäŸã§ãïŒã³ã¡ã³ãã³ãŒãããã®é£ã®è¡ã§å€æŽããŠã¿ãŠãã ããïŒãå€éšé¢æ°ã®åŒã³åºãã«é¢é£ããminpdããã§ãã¯ãïŒã³ã³ãã€ã©ãã©ã°ã®-O3ãæå®ãããŠããããšã確èªããŠãã ããïŒãåãæ¿ããŸãGCCãšCLANGïŒGCCãã©ã³ã¯ã«ã¯ä»ã®ãšããåããã°ãããããã§ã:)ïŒïŒ
fenv.hãèŠããšãåºæ¬çã«ããã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããã³ãŒãå ã®ãã¹ãŠã®é¢æ°ã«ã¯ãåãåé¡ã®å¯èœæ§ããããŸãã ãããã£ãŠãããããã³ãŒãã§åŒã³åºãããŠãããã®ã¯ãã¹ãŠãnumpy / core / src / npymath /ieee754.cã§äœ¿çšãããŠããŸãã
ç§ã®æèŠã§ã¯ãclangã¯çŸåšãæé©åã䜿çšããŠãã®ã¿ã€ãã®é¢æ°ã®å®å
šãªã³ãŒããçæã§ããªãããããªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
A. gccïŒå°ãªããšãå
¬åŒã®Macãã€ãŒã«ïŒã§ã³ã³ãã€ã«ããclangã§ã³ã³ãã€ã«ãããšèŠåã衚瀺ãããŸãã
B. Clangã¯ãé¢æ°ããšã«optnoneå±æ§ããµããŒãããŸããããã¯ãclangã§ã³ã³ãã€ã«ãããå Žåããã¹ãŠã®æé©åïŒäœéã§ããæ£ããã³ãŒãïŒãç¡å¹ã«ããããã«ãã®ãããªé¢æ°ã«æ¯ããããããšãã§ããŸãã
https://clang.llvm.org/docs/AttributeReference.html#optnone -clang-optnone-clang-optnone
ã³ã³ãæŒç®åã«åãæ¿ããŠããŸã£ãã圹ã«ç«ã¡ãŸãã- ;
ã¯ãã§ã«ã·ãŒã±ã³ã¹ãã€ã³ãã§ãã
@ eric-wieserããããã§ããïŒ ;
ãã·ãŒã±ã³ã¹ãã€ã³ããšããŠãªã¹ããããŠããŸããã https://msdn.microsoft.com/en-us/library/azk8zbxd.aspx ã
ãããã®å Žåããã³ã³ãæŒç®åã®åŒæ°ãè©äŸ¡ãããé åºã¯ä¿èšŒãããŸããã ;
ã§åºåãããã¹ããŒãã¡ã³ãã®å Žåã¯ããã§ã¯ãããŸããã
@charrisæ®å¿µãªãããææ¡ãããå€æŽã§ã¯åé¡ã解決ãããªãããã§ãã
diff --git a/numpy/core/src/umath/simd.inc.src b/numpy/core/src/umath/simd.inc.src
index 2241414ac..8345e3ef7 100644
--- a/numpy/core/src/umath/simd.inc.src
+++ b/numpy/core/src/umath/simd.inc.src
@@ -1038,9 +1038,8 @@ sse2_@kind@_@TYPE@(@type@ * ip, @type@ * op, const npy_intp n)
c1 = @vpre@_@VOP@_@vsuf@(c1, v1);
c2 = @vpre@_@VOP@_@vsuf@(c2, v2);
}
- c1 = @vpre@_@VOP@_@vsuf@(c1, c2);
- if (npy_get_floatstatus() & NPY_FPE_INVALID) {
+ if (c1 = @vpre@_@VOP@_@vsuf@(c1, c2), npy_get_floatstatus() & NPY_FPE_INVALID) {
*op = @nan@;
}
else {
å€æ°ãæ®çºæ§ãšããŠããŒã¯ãããšåé¡ã解決ããããšã«æ³šæããŠãã ããã
ä»ã®ããªãšãŒã·ã§ã³ãè©ŠããŠã¿ããå Žåã¯ãç¥ãããã ããã
ã³ã³ãã€ã©ã¯ãã³ã³ãæŒç®åã«é¢ããä»æ§ã«æºæ ããŠããªãããã§ããå°ãªããšããä»æ§ãç解ããŠããããã§ãã ã³ã³ãã€ã©ã®çŸåšã®ç¶æ
ã«å¯Ÿããæãç°¡åãªè§£æ±ºçã¯ãè匱ã«èŠããŸããã volatile
è¿œå ããããšã®ããã§ãã
ããŠãGCC 8.1ããªãªãŒã¹ãããã°ããã§ãäœãæšæž¬ããŸãã...æé©åãããGCCã¯ãclangãããã§è¡ãã®ãšåãåé¡ãçæããŸãhttps://github.com/numpy/numpy/issues/10370#issuecomment -384154230ïŒã³ã³ãã¯çæãããŸããïŒæåŸ ã©ããã«ããã§åœ¹ç«ã¡ãŸãããvolatileã¯ããããŸãïŒãdistutilsãããã軜æžããgccãã©ã°ãæå¹ã«ãããã©ããã¯ããããŸããããããã§ã¯ãªããšæããŸãã
GCC 8.1ã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãïŒåé¡ããªã7.3ãšæ¯èŒã§ããŸãïŒã
https://godbolt.org/g/AJRdRQ
ããã§ãasmã§minpdããã³npy_get_floatstatusåŒã³åºããæ€çŽ¢ããŸãã
ãšãããããåé¡ãçºçããå Žåã«åé¡ãéç¥ããã¯ãã®ããã€ãã®ãã¹ããšäžç·ã«ãæ®çºæ§ã䜿çšããŠã¿ãŸãããã ç§ãã¡ãèŠããããããªãå¥ã®ãªãã·ã§ã³ã¯ãæ®çºæ§ãŸãã¯ã³ã³ãã€ã©æ什ã䜿çšã§ããå¥ã®é¢æ°ã§ããã管çã容æã«ããããã«1ã€ã®å Žæã«ãããŸãã
ããã¯ããã®ç¹å®ã®åé¡ãããã¯ããã«å€§ããªã±ãŒã¹ã§ãã ieee754.cã®é¢æ°ãåŒã³åºãnumpyã³ãŒãã¯ãã¹ãŠãç£æ»ããŠä¿®æ£ããå¿ èŠããããŸãã ïŒãã¶ãããã®åé¡ã®ååãããäžåºŠå€æŽããããæ°ããåé¡ãéããŠãã ããïŒã
minpdåœä»€ã®é©ãã¹ãåäœã¯ã https ïŒ//github.com/numpy/numpy/issues/10370#issuecomment-381241813ã«é¢é£ããŠããå¯èœæ§ããã
ãã®åœä»€ã®1ã€ã®å€ã®ã¿ãNaNïŒSNaNãŸãã¯QNaNïŒã§ããå Žåã2çªç®ã®ãªãã©ã³ãïŒãœãŒã¹ãªãã©ã³ãïŒïŒNaNãŸãã¯æå¹ãªæµ®åå°æ°ç¹å€ïŒãçµæã«æžã蟌ãŸããŸãã
åç §ïŒ http ïŒ
@mattkretzã¯
@tzickeläžæè°ãªããšã«ãåé¡ã¯ã©ã®ã¬ãã«ã®æé©åã§çºçããŸããïŒ ä»¥åã¯-O2
ã«å¶éããŠããŸããããäžéšã®ãã©ãããã©ãŒã ã§ã¯-O3
ãŸãã¯åçã®ãã®ã䜿çšããŠãããšæããŸãã
ãã®gccãã°ãšåæ§ã«ãç§ã¯æããŸãïŒ https ïŒ
ããã§ã¯#pragma STDC FENV_ACCESS ON
èšå®ããã®ãæ£ãã解決çã®ããã§ãããC99ãå¿
èŠã§ããããã䜿çšããã«ã¯ãPython2.7ãåé€ããå¿
èŠããããŸãã ãããããGCC --std=c90
ã¢ãŒãã¯ããã©ã°ãããªãããã«æé©åãè¡ãããšãã§ãããšæ³å®ããŠããŸãã
ãã¹ãŠã®è³ªåã«ã€ããŠã¯ããã¡ãã®ãªã³ã¯ã«ã¢ã¯ã»ã¹ããŠãã ããã
https://godbolt.org/g/AJRdRQïŒ*å ±æãããŠããããã§ãã®ã§ãå ¥åãæ°ãããŠã£ã³ããŠã«ã³ããŒããŠ
ã³ã³ãã€ã©ã®ããŒãžã§ã³ãã³ã³ãã€ã©ãã©ã°ãã³ãŒããå€æŽããŠããã®å Žã§çµæã確èªããŠã¿ãŠãã ãã...
ããã¯ãäž¡æ¹ã®ææ°ã®ã³ã³ãã€ã©ã§-O1ã䜿çšããŠããå Žåã«çºçããŸãã #pragmaã¯äœãããŠããªãããã§ã...ã
ãã®ããŒãžã§ã³ã¯éåžžã«è€éã§ãã¢ã»ã³ãã©ãå€ãããŠãã¢ã»ã³ãã©ãcã³ãŒãã«é¢é£ä»ããã®ãå°é£ã§ãã å ã®ããŒãžã§ã³ã¯ã¯ããã«åçŽã§ãåé¡ãå®èšŒããŸããã
PRãã芧ãã ãã
ããŒã....ã©ã®OS /ã³ã³ãã€ã©ã§numpy-1.14.3-cp27-cp27mu-manylinux1_x86_64.whlïŒpypiã¢ãŒã«ã€ãããïŒãã³ã³ãã€ã«ãããã®ã誰ãæããŠããããŸããïŒ ããã«ãå¥ã®ïŒé¢é£ããïŒåé¡ãé ããŠããã®ã§ã¯ãªãããšæããŸãã
@tzickelããã©ã«ãã®ubuntuã®ä¿¡é Œã§ããã³ã³ãã€ã©ã¯èŠåœãããŸããã
@charris manylinuxã³ã³ããã¯ãgcc4.2ãã€ã³ã¹ããŒã«ãããCentos5ãå®è¡ããŸãã
@ngoldbaumæ
å ±ãããããšãã éããªãPython3.7çšã®ãã€ãŒã«ãæ§ç¯ããå¿
èŠããããŸãã ããã¯travis.ymlãã«ããããªãã¯ã¹ã«MB_PYTHON_VERSION=3.7
ãšã³ããªãè¿œå ããã®ãšåããããç°¡åã§ããïŒ
manylinuxããŒã«ãæŽæ°ããããŸã§åŸ ã€å¿ èŠããããšæããŸãã python3.6ãIIRCã«ç»å ŽããŠããæ°é±éããããŸããã @njsmithã¯ãããããã£ãšç¥ã£ãŠããŸãã
@ngoldbaum gcc 4.2
éžãã çç±ã¯äœã§ããïŒ å¿
èŠã«å¿ããŠãæ°ããããŒãžã§ã³ã®ã³ã³ãã€ã©ã䜿çšããã®ã¯ç°¡åã§ããïŒ
gcc 4.2ãéžæãããã£ããã¯äœã§ããïŒ
ç®æšã¯ããã€ããªäºææ§ã®åé¡ãå®éã«ã¯åé¡ã«ãªããªãã»ã©å€ãglibcã§ã³ã³ãã€ã«ã§ããããã«ããããšã ã£ããšæããŸãã
å¿ èŠã«å¿ããŠãæ°ããããŒãžã§ã³ã®ã³ã³ãã€ã©ã䜿çšããã®ã¯ç°¡åã§ããïŒ
ç¥ããŸããã ãŸããnumpyã建ç©ã®è»èŒªãã©ã®ããã«ç®¡çããŠããããããããŸããã ãããžã§ã¯ãã«MatthewBrettã®ãã«ããã«ããããžã§ã¯ãã䜿çšããŠããŸãããããžã§ã¯ãçšã®python3.7ãã€ãŒã«ããã«ãããã«ã¯ããããæŽæ°ããããŸã§åŸ ã€å¿ èŠããããŸãã
ãããæçµçãªé¢é£ã®åé¡ã§ãããã©ããã¯ããããŸãããããã®SSEã³ãŒãã§å¥ã®åé¡ãèŠã€ãããšæããŸãã
numpy 1.14.0ã§ã¯ãFPãšã©ãŒãçºçããå Žåã«ã©ã³ã¿ã€ã èŠåãã¹ããŒããã³ãŒããè¿œå ãããŸããã
https://github.com/numpy/numpy/commit/d47ca7b26172c42b01c3132d0e46e70578c8ea21
ããããSSEã®å®è£
ãããäžåºŠèŠããšã次ã®ããã«ãªããŸãã
https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1020
ã¢ã¬ã€ã®äžå€®ã«é 眮ãããéšåã®ã¿ãFPUãééããããããŒãšãã¬ãŒã©ãŒïŒã¡ã¢ãªã«é 眮ãããŠããªããããSSEå¯èœã§ã¯ãªãïŒãæåã§NaNããã§ãã¯ãããFPUãçµç±ããªãããšãããããŸããSSEã¯ããŒãã¯ããããã®ã§ãäžå€®ã®ããŒãã ããNaNèŠåãããªã¬ãŒããä»ã®ããŒãã¯ïŒå ¥åãšåºåãåçã§ããéïŒããªã¬ãŒããŸããã ããã¯å€§äžå€«ã§ãã ïŒ
np.minïŒ[1ãnp.nanã1ã1ã1ã1ã1ã1]ïŒã¯ã©ã³ã¿ã€ã èŠåãããªã¬ãŒããŸãã
ããããnp.minïŒ[1ã1ãnp.nanã1ã1ã1ã1ã1]ïŒã¯ããããŸãã
np.minïŒ[1ãnp.nanã1ã1ã1ã1ã1ã1]ïŒã¯ã©ã³ã¿ã€ã èŠåãããªã¬ãŒããŸãã
@tzickelããã¯ïŒ11029ã«é¢é£ããŠããŸãããïŒ
ç·šéïŒãã©ãŒããã
ãœãŒã¹ã®åé¡ã¯ïŒ8954ã ã£ãããã§ãPRïŒ9020ã«ã€ãªãããŸãã
ã¯ãããããç§ã®ãã€ã³ãã¯ãïŒ9020ããã¹ãŠã®å¯èœãªã±ãŒã¹ãã«ããŒããŠããªãã£ããšããããšã§ãã ãããã®1ã€ã¯ãã®SSEã³ãŒãã§ãïŒããã¯ããã€ãã®æé©åã®ããã«ãã®ã¡ã«ããºã ãç Žå£ããŸãïŒã
ïŒ11029ã«ã€ããŠã¯ãNaNã®äŒæã®ãã°ã«å ããŠããã¡ãã¡ã®æçš¿ã®äž¡æ¹ã§ãèŠåã衚瀺ãããå Žåãšè¡šç€ºãããªãå Žåãããçç±ãç解ããããšããŠããŸãã
å¥ã®è³ªåã¯ãNaNãå ¥åã«ååšããå Žåãæå°/æ倧ã®äž¡æ¹ã®çµæã§ããããã§ã«isNan /ç¡å¹ããã§ãã¯ããŠããå ŽåãNaNã®æåã®ã€ã³ã¹ã¿ã³ã¹ãæ€åºãããšãã«é«éçµäºããã¹ãã§ã¯ãããŸãããïŒ
@tzickelãããã®åæžæäœãæ©æçµäºããŸããã å°æ¥ãgufuncsãšããŠãªãã¡ã¯ã¿ãªã³ã°ãããå¯èœæ§ããããŸãã