์ด ์กฐ์ฌ๋ scipy CI๊ฐ ์ง๋ ๋ฉฐ์น ๋์, ์ฆ 1.14๊ฐ ์ถ์ ๋ ํ appveyor ์์ ๋ฐ์ํฉ๋๋ค .
๋ด ์ง ์ปดํจํฐ (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
์ฒซ ๋ฒ์งธ ์ฝ๋ ์์ ์ธํธ์์ ์ฒ์ ์ธ ๊ฐ์ ์์ ์์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ์ง ์๊ณ ๋ง์ง๋ง ์์ ๋ง ๋ฐ์ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋ ๋ฒ์งธ ์์ ์ธํธ์์๋ ๊ฒฝ๊ณ ๊ฐ ์ ํ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ธ๋ถ ์ฐธ์กฐ scipy / scipy # 8282, scipy / scipy # 8279
์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ์์ ์ AVX ๋ฑ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ (์ ๋ง numpy๊ฐ ์๋) ํ๋์ ์ ๋ฐํ๋ ๋ค๋ฅธ ์ฝ๋ ๊ฒฝ๋ก ์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ฝ๊ฐ ๋ฌด์์๋ก ๋ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค ....
๊ทธ๊ฒ์ด ๊ทธ๊ฒ๊ณผ ๋ง์ ๊ด๋ จ์ด ์๋ค๋ฉด Dunno, ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๊ธฐ๋ํ์ง๋ง, numpy๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ ์์์ ์ค๋ฅ์ ๋ํด ๋๋ฌด ๋ง์ดํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌด์จ ์ผ์ด ์์๋์ง ํ์ธํ๋ ๊ฒ ๋นผ๊ณ .
Chuck์ด ๋งํ๋ฏ์ด,์ด ๋ถ๋ ์์์ ์ค๋ฅ ํ๋๊ทธ๋ ๋ถํํ๋ ์์คํ ๋ง๋ค ๋ค๋ฆ ๋๋ค.
์ข์, ์ค๋ฅ๊ฐ ์ผ๋ถ ์ค์น์์๋ง ๋ฐ์ํ๊ณ ๋ค๋ฅธ ์ค์น์์๋ง ๋ฐ์ํ๋ ์ด์ ๋ฅผ ์ดํดํ์ต๋๋ค.
scipy๊ฐ NaN์ ํฌํจ ํ ์์๋ ๋ฐฐ์ด์์ np.min์ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ทธ๊ฒ์ด ์กด์ฌํ๋์ง ํ์ธํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. numpy ๋ฌธ์๋ ์ด๊ฒ์ด ํ์ฉ๋๋ค๋ ๊ฒ์ ์ ์ํฉ๋๋ค.
NaN ๊ฐ์ด ์ ํ๋ฉ๋๋ค. ์ฆ, ํ๋ ์ด์์ ํญ๋ชฉ์ด NaN์ด๋ฉด ํด๋น ์ต์๊ฐ๋ NaN์ด๋ฉ๋๋ค.
์ด๊ฒ์ด np.min์ ๋ํด ํ์ฉ๋๋ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ์ฌ์ฉ ๊ด์ ์์ ๊ฒฝ๊ณ / ์ค๋ฅ๊ฐ ์ ํ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค.
(์๋ฅผ ๋ค์ด 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์ ๋๋ฌ ํ ๋ min์ด NaN์ ์ ํ ์ ํํ์ง ์๋ ์ ์ฌํ ๋์์๋ณด๊ณ ์์ต๋๋ค.
> 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๋ ์๋๋๋ค. python 2.7.13 ๋ฐ numpy 1.14.2๋ฅผ ์ฌ์ฉํ๋ fresh 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
๋ ๊ฐ์ "this should be nan as per docs : 19.0 "์ค์ด ์์ต๋๊น?
๋ํ ๊ฒฝ๊ณ ๋ numpy 1.13.1์ ๋ํ๋์ง ์์ต๋๋ค (์ด ๋์์ ์ฒ์ ๊ด์ฐฐ ํ ๊ณณ์ ๋๋ค.)
@kippr NumPy๋ฅผ ์ด๋์ ์ป์์ต๋๊น?
8 ๊ฐ์ ์์ ๊ฒฝ๊ณ๊ฐ AVX512์ ๊ด๋ จ์ด์์ ์ ์๊ณ ๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ์ CPU์ ์กฐํฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ค CPU / ์ปดํ์ผ๋ฌ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@juliantaylor ์๊ฐ?
์ ๋ ฌ๋ ํจ๊ณผ๊ฐ์์ ์ ์์ต๋๋ค.
์๋ ํ์ธ์ @charris
์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด ๋ด ๊ฒ์๋ฌผ์ ์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
CPU :
โ sysctl -n machdep.cpu.brand_string Intel (R) Core (TM) i7-6700K CPU @ 4.00GHz
NumPy ๋ Mac์ ์๋ก์ด virtualenv (homebrew๋ฅผ ํตํด ์ค์น๋ Python 2.7.13)์์ pip๋ฅผ ํตํด ์ค์น๋์์ผ๋ฏ๋ก ๋ชจ๋ ๊ธฐ๋ณธ ์ปดํ์ผ๋ฌ ํ๋๊ทธ ๋ฑ์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๊น?
๋ฐฉ๊ธ ๊ฐ์ ํ๊ฒฝ์ ๋ค์ ๋ง๋ค๊ณ pip ์ค์น๋ฅผ ๋ค์ ์คํํ์ต๋๋ค. ์ฌ๊ธฐ์ ๋์ ๊ด๋ จ์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์น์ ์ค๋ ๋ฉ์์ง๊ฐ ๋ง์ด ์์ต๋๋ค .. (์ ์ฒด ๋ก๊ทธ ์ฒจ๋ถ.) ๋ค๋ฅธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์. ๋น๋ ๋๋ ํ ๋ฆฌ ๋๋ ๊ธฐํ ๋ค๋ฅธ ์์ ์ ์ํํ๊ฑฐ๋ ์๋ ํ ์ปดํ์ผ ํ๋๊ทธ๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
[..]
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
๊ฐ์ฌ
ํฌ๋ฆฌ์ค
์ถ์ ์ ์๋ง ๋๋ผ์ด ์ผ์ด ์๋์ง๋ง 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
AVX2 ๋ฐ sse4.2 ๊ธฐ๋ฅ์ด์๋ CPU์์ ๋์ผํ numpy ๋ฒ์ (์์น์์)์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ 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])
๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ์ฝค๋ณด๋ฅผ ๋ ์๋ํ๊ณ ๋ค์์ ์ฐพ์์ต๋๋ค (๋ง์ง๋ง ๊ฐ, 8 ๊ฐ ๊ฐ ๋ฐ ์ถ = 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-๋ง์ต๋๋ค. Mac๊ณผ Windows์์๋์ด ๋์์ ๊ด์ฐฐํ์ง๋ง Linux๋ ๊ด์ฐฎ
๊ฐ์ฌ
ํฌ๋ฆฌ์ค
@kippr ์ด๊ฒ์ ๊ธฐ๋ณธ ์์ ์ ์ํฅ์ ๋ฏธ์น๊ณ ๋ฌธ์ ๊ฐ NumPy์์ ๋น๋กฏ๋ ๊ฒ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ง ๋ฐฉํด๊ฐ๋๋ ๋ฒ๊ทธ์ ๋๋ค. MAC ๋ฐ Windows์์ ๋ฒกํฐํ๋ฅผ ๋๊ณ ๋์์ด๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ Python 2.7์์๋ง ๋ณด์ ๋๊น?
1.14์์์ด ๋์์ ๋ณ๊ฒฝ ํ NumPy์ ์ด๋ค ๊ฒ๋ ๋ณผ ์ ์์ต๋๋ค. ์๋ง๋ OpenBLAS๊ฐ ์ปจํธ๋กค์ ์กฐ์ํ๊ณ ์์ ๊ฒ์ ๋๋ค ...
ํธ์ ๋ด์ ๊ฐ๊ธฐ
์๋ ํ์ธ์ @charris
Mac์ python 3์์๋์ด ๋์์ด ๋ณด์ ๋๋ค.
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์ python 2.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 openblas ๋ฐ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ numpy / scipy์ ๋์์ ์ํฅ์ ๋ฏธ์น ์์๋ numpy์ ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ์ฌ์ ์์ ๋ณด์์ต๋๋ค (๋ด ๊ฒฝํ์ ๋ฐ๋ผ). ์ฐ๋ฆฌ๊ฐ ์ทจํ ์์๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋์ด๋ฅผ C (openblas ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ) ํ ์คํธ์ ์ ์ฉํ์ฌ ๋์์ ๋ถ๋ฆฌํ๊ณ ๋ณต์ ํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ๋ํ ์ด๊ฒ์ด MAC ๋ฐ Windows์ ์๋์ง ๋ค์ ํ์ธํ๊ธฐ ์ํด ๋ง์ต๋๊น? ๋๋ ๋ฆฌ๋ ์ค์์์ด ๋์์ ๋ณผ ์ ์๋ค (vx ํจ์น๋ 1.15 ์ฉ์ผ๋ก ๋ค์ด๊ฐ๋ฏ๋ก ์ด๊ฒ์ ์ํฅ์์ฃผ์ง ์์์ผํ๋ค). @kippr Mac / windows์์ numpy๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์์ต๋๊น? ๋ฌธ์ ์ธ์ฌ
์๋ ํ์ธ์ @VictorRodriguez
์ด๊ฒ์ Mac์ ๊ฒฝ์ฐ ์๋ก์ด virtualenv ์ธ ๋ ํ๋ซํผ์์ pip ์ค์น๋ฅผ ํตํด ์ด๋ฃจ์ด์ก์ต๋๋ค. python 2.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 pragma๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๊น?)
์ด ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ 5 ๋ ์ด ์ง๋ฌ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ์ ์์ธ์ ์ ๋ฒ์ ์ clang ๋ฐ ๋ค๋ฅธ ์ต์ ํ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค @tzickel
๋ช ๋ฌ ์ ์ ๊ณ ๋ฑํ๊ต ๋๋ถํฐ C๋ฅผ ์์ฑํ์ง ์์๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ๋ช ํ ๋ฐฉ๋ฒ์ ํ์คํ ์์๋ผ ์๋ ์์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์๋๋ก ํ๊ฐํ๋๋ก ๋ช ๊ฐ์ง ์๋๋ฅผํ์ต๋๋ค. ์์ if ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํฉ๋๋ค.
if ((sizeof(c1) != 0) || (sizeof(c1) == 0) & npy_get_floatstatus() & NPY_FPE_INVALID) {
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์ด๋ ๊ฒํ๋ฉด ๋ฒ๊ทธ๊ฐ ์ฌ๋ผ์ง๋๋ค.
(๋๋ ๋ํ ์ปดํ์ผ๋ฌ๊ฐ if ๋ฌธ๋ณด๋ค ๋จผ์ _mm_min_pd๋ฅผ ํ๊ฐํ๋๋กํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฉ์ฒญํ ํ์์ ์๋ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด if ๋ฌธ ์์ชฝ์ c1์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐฐ์นํ๊ณ if / else ๋ธ๋ก ๋ค์ ๋ชจ๋ ์๋ฌด ์์ฉ์ด ์์ต๋๋ค. ์ด์จ๋ ์์๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ํญ์ c = _mm_min_pd ํ ๋น์ ์คํํ๊ฑฐ๋ ๋ด ํธ์ถ์ด ์ค์ ๋ก ํ ํ์ ๋๋ ๋ค๋ฅธ ํ์์ noops๋ผ๊ณ ์๊ฐํ์ต๋๋ค.)
๊ทธ๋ฌ๋ ์ด์จ๋ ๋ด๊ฐ๋ณด๊ณ ์๋ ๋ฒ๊ทธ๋ฅผ ์๋ณํ์์ ํ์ธํ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ปดํ์ผ๋ฌ์๊ฒ _mm_min_pd ๋ฐ npy_get_floatstatus์ ์์๋ฅผ ๊ทธ๋๋ก ๋๋๋ก ํํธ ํ ์์๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ข์ต๋๋ค. Google์ด ์ ์ํ ๋ ๋ค๋ฅธ ํ ๊ฐ์ง : 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 ์ ๋ํ ์ถ๊ฐ ๋๋ฒ๊ทธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ๊น์ ๋๋ฒ๊ทธ ์์ต๋๋ค . ๋ํ gcc๋ฅผ ์ฌ์ฉํ์ฌ Linux ์์คํ ์์ ์คํ ํ ๊ฒฝ์ฐ :
$ ํ์ด์ฌ
Python 3.6.5 (๊ธฐ๋ณธ๊ฐ, 2018 ๋
4 ์ 1 ์ผ, 15:40:54)
Linux์ [GCC 7.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 install numpy์ผ๋ก ์ด๊ฒ์ ๋ณด๋ ์ด์ ์ ๋๋ค. ์ด๋ป๊ฒ ๋ง๋ค์ด ์ก์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ด๋ค ํ๋๊ทธ๊ฐ ์ฌ์ฉ ๋์์ต๋๊น?
๋ํ ๋ด 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 ์ฝ๋ ์์ ์ค๋ ๋๋ก๋ถํฐ ์ผ๋ง๋ ์์ ํ์ง ๊ถ๊ธํฉ๋๋ค.
@VictorRodriguez python2.7์ ์ฌ์ฉํ์ฌ Mac์์ pip install numpy๋ฅผ ์คํํ๋ฉด ์์ค์์ ๋น๋๋ฉ๋๋ค. python3์ผ๋ก pip install์ ์คํํ๋ฉด ํ ์์ ์ค์น๋ฉ๋๋ค.
pip install์ ์ ์ฒด ์ถ๋ ฅ์ ์บก์ฒํ์ต๋๋ค. https://github.com/numpy/numpy/files/1912086/build.log
์์ ๋ณ๊ฒฝ ์ฌํญ์ ํ
์คํธํ๊ธฐ ์ํด ์์ค (ํ์ฌ ๋ง์คํฐ)์์ ๋น๋ํ์ง๋ง ์กฐ์ ํ์ง ์์๋ ์ฌ์ ํ ๊นจ์ง ๋์์ด ๋ณด์ด๋์ง ํ์ธํ์ต๋๋ค. ๋น๋ ํ ๋ INSTALL.rst.txt์ ์ ์ ๋ ๋ช
๋ น ์ค์ ์ฌ์ฉํ์ต๋๋ค.
python setup.py build -j 4 install --prefix $HOME/.local
ํ๋ง๋๋ก, ์ฌ๊ธฐ ๋๊ตฐ๊ฐ๊ฐ ์ฐฝ๋ฌธ์์๋ ๋ฒ๋ ๋ฅผ ๋ณด์๋ค๊ณ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด Windows์์ clang์ผ๋ก ์ปดํ์ผ๋์ง ์์๋ค๊ณ ๊ฐ์ ํ์ง๋ง MSVC ๋๋ GCC๋ฅผ ์ฌ์ฉํ๋ฉด numpy๊ฐ ํ๋ซํผ์ ๊ท์น์ ์ค์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธ ํ ์ ์์ต๋๋ค. Windows์์ numpy๋ fp ์ํ๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ ์ํด _statusfp๋ฅผ ์ฌ์ฉํ๋ฉฐ MSDN ์ค๋ช ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ ์์ต๋๋ค.
๋ง์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ ์์ธกํ ์์๋ ๊ฒฐ๊ณผ๋ก ๋ถ๋ ์์์ ์ํ ์ด๋ฅผ ์์ ํฉ๋๋ค. ์ต์ ํ๋ _status87, _statusfp ๋ฐ ๊ด๋ จ ํจ์์ ๋ํ ํธ์ถ๊ณผ ๊ด๋ จ๋ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์ฌ์ ๋ ฌ, ๊ฒฐํฉ ๋ฐ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค. / Od (๋นํ์ฑํ (๋๋ฒ๊ทธ)) ์ปดํ์ผ๋ฌ ์ต์ ๋๋ fenv_access pragma ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์ฌ์ ๋ ฌํ๋ ์ต์ ํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
GCC ๋ฐ MSVC (ํ์ฌ clang์ ์๋)์๋์ด๋ฅผ ์ ์ดํ๋ โโpragma๊ฐ ์์ต๋๋ค.
@tzickel ์ Windows ๋น๋๊ฐ cygwin๊ณผ ํจ๊ป ์๋ค๊ณ ๋งํ์ต๋๋ค. MSVC๋ก ๋๋ฅผ ์ํด ์ฌํํ์ง ์์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก @charris ์ ์ ์์ ์ข์ํฉ๋๋ค. ํ์ค C์ด๋ฉฐ pragma๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ AFAICT๋ ์ค๋ฒ ํค๋๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
/* 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) {
ํ์ด์ฌ 2.7์ ์ฌ์ฉ๋๋ Visual Studio 8 ์ปดํ์ผ๋ฌ์์๋ ์ง์๋ฉ๋๋ค.
๋ ๋ฒ์งธ, ๋ ๊ฐ๊ฒฐํ ์ ์์ ๋๋ฌด ๋๋
ํด ๋ณด์
๋๋ค.
์ด ๋ฒ๊ทธ์ ์ทจ์ฝํ ์ฝ๋์ ๋ค๋ฅธ ์์น๊ฐ ์์ต๋๊น?
cygwin ๋น๋์ GCC๊ฐ ๋์ ์๋๋ฐ, ์ด๋ ๋ฒ๊ทธ๊ฐ Linux์ฒ๋ผ ์๋ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ์ผํ ์ฐ์ฐ์๋ ์ต์ ํ์ ๋์์ด๋์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์์ค์ ์ฝ๋ ์์ฑ์์ ์๋ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ฌ์ ํ ๋ ํํ์์ด ์๋ก ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ๊ณ ์ด๋ํ ์ ์์ต๋๋ค. ๋ค์์ ์ด๊ฒ์ด ์ฌ๋ก์์ ๋ณด์ฌ์ฃผ๋ ์์ ์์ ์ ๋๋ค (์์์๋ ์ค๋ก ์ฃผ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด๋ณด์ญ์์ค). GCC ๋ฐ CLANG (GCC ํธ๋ ํฌ์๋ ํ์ฌ ๋์ผํ ๋ฒ๊ทธ๊ฐ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค :)) :
fenv.h๋ฅผ ์ดํด๋ณด๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ํ์ผ์ ์ก์ธ์คํ๋ ์ฝ๋์ ๋ชจ๋ ํจ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ numpy / core / src / npymath / ieee754.c์์ ์ฌ์ฉ๋๋ ์ฝ๋์์ ํธ์ถ๋๋ ๋ชจ๋ ๊ฒ
์ ์๊ฐ์๋ clang์ ํ์ฌ ์ต์ ํ๋ฅผ ํตํด ์ด๋ฌํ ์ ํ์ ํจ์์ ๋ํ ์์ ํ ์ฝ๋๋ฅผ ์์ฑ ํ ์ ์์ผ๋ฏ๋ก ์ต์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
A. gcc (์ต์ํ ๊ณต์์ ์ธ mac wheel)๋ก ์ปดํ์ผํ๊ณ 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 (์ผํ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์์๋๋ก ๊ฑฐ๊ธฐ์ ๋์์ด๋์ง๋ง ํ๋ฐ์ฑ์ํฉ๋๋ค), distutils๊ฐ ์ด๊ฒ์ ์ํํ๋ gcc ํ๋๊ทธ์์ ํ์ฑํํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ทธ๋ ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค์์ GCC 8.1์ ์ฝ๋์
๋๋ค (๊ด์ฐฎ์ 7.3๊ณผ ๋น๊ตํ ์ ์์ต๋๋ค).
https://godbolt.org/g/AJRdRQ
asm์์ minpd ๋ฐ npy_get_floatstatus ํธ์ถ์ ๊ฒ์ํ์ญ์์ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ํธ๋ฅผ ๋ณด๋ด์ผํ๋ ๋ช ๊ฐ์ง ํ ์คํธ์ ํจ๊ป ์ ์ ํ๋ฐ์ฑ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ดํด๋ณผ ์์๋ ๋ ๋ค๋ฅธ ์ต์ ์ ํ๋ฐ์ฑ ๋๋ ์ปดํ์ผ๋ฌ ์ง์๋ฌธ์ ์ฌ์ฉํ ์ ์์ง๋ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๋๋ก ํ ๊ณณ์ ๋ ์์๋ ๋ณ๋์ ํจ์์ ๋๋ค.
์ด๊ฒ์ ํน์ ๋ฌธ์ ๋ณด๋ค ํจ์ฌ ๋ ํฐ ๊ฒฝ์ฐ์ ๋๋ค. ieee754.c์์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ชจ๋ numpy ์ฝ๋๋ ๊ฐ์ฌ ๋ฐ ์์ ์ด ํ์ํฉ๋๋ค. (์๋ง๋์ด โโ์ด์์ ์ด๋ฆ์ ๋ค์ ๋ฐ๊พธ๊ฑฐ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ์๋ก์ด ์ด์๋ฅผ ์ฌ๋ ๊ฒ์ ๋๋ค).
minpd ๋ช ๋ น์ด์ ๋๋ผ์ด ๋์์ https://github.com/numpy/numpy/issues/10370#issuecomment -381241813๊ณผ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค.
์ด ๋ช ๋ น์ด์ ๋ํด ํ๋์ ๊ฐ๋ง NaN (SNaN ๋๋ QNaN)์ด๋ฉด ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์ (์์ค ํผ์ฐ์ฐ์) (NaN ๋๋ ์ ํจํ ๋ถ๋ ์์์ ๊ฐ)๊ฐ ๊ฒฐ๊ณผ์ ๊ธฐ๋ก๋ฉ๋๋ค.
@mattkretz ๋ ๊ทธ๋ ๊ฒ ๋ณด์ด์ง ์์ต๋๋ค. (๊ทธ๊ฒ์ด ์์๋๋ ๋์์ด๋ฉฐ์ด ๊ฒ์ฌ๊ฐ ์ด๋ฏธ ์ํ ๋ ์ด์ ์ ๋๋ค).
@tzickel ๊ถ๊ธํด์ ์ด๋ค ์์ค์ ์ต์ ํ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๊น? ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ์ -O2
๋ก ์ ํํ์ง๋ง ์ผ๋ถ ํ๋ซํผ์ -O3
๋๋ ์ด์ ๋๋ฑํ ๊ฒ์ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด gcc ๋ฒ๊ทธ์ ๋น์ทํ๊ฒ ์๊ฐํฉ๋๋ค : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=6065
#pragma STDC FENV_ACCESS ON
์ด ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ
์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ฉํ๋ ค๋ฉด Python 2.7์ ์ญ์ ํด์ผํ๋ C99๊ฐ ํ์ํฉ๋๋ค. ์๋ง๋ GCC --std=c90
๋ชจ๋๋ pragma๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ต์ ํ๋ฅผ ์ํ ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ชจ๋ ์ง๋ฌธ์ ์ฌ๊ธฐ ๋งํฌ๋ก ์ด๋ํ์ญ์์ค.
https://godbolt.org/g/AJRdRQ (* ๊ณต์ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ ๋ ฅ์ ์ ์ฐฝ์ ๋ณต์ฌ ํ ์ ์์ต๋๋ค)
์ปดํ์ผ๋ฌ ๋ฒ์ , ์ปดํ์ผ๋ฌ ํ๋๊ทธ ๋ฐ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์์์ ํ์ธํ์ญ์์ค.
์ด๊ฒ์ ๋ ์ต์ ์ปดํ์ผ๋ฌ์์ -O1์ ์ฌ์ฉํ ๋ ๋ฐ์ํฉ๋๋ค. #pragma๋ ์๋ฌด๊ฒ๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค ....
์ด ๋ฒ์ ์ ๋งค์ฐ ๋ณต์กํ๊ณ ์ด์ ๋ธ๋ฌ๊ฐ ๋๋ฌด ๋ง์ผ๋ฉฐ ์ด์ ๋ธ๋ฌ๋ฅผ c ์ฝ๋์ ์ฐ๊ฒฐํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์๋ ๋ฒ์ ์ ํจ์ฌ ๋ ๊ฐ๋จํ๊ณ ๋ฌธ์ ๋ ์์ฐํ์ต๋๋ค.
PR ์ฐธ์กฐ
ํ .... ๋๊ตฌ๋ ์ง numpy-1.14.3-cp27-cp27mu-manylinux1_x86_64.whl (pypi ์์นด์ด๋ธ์์) ์ปดํ์ผ ๋ OS / ์ปดํ์ผ๋ฌ๊ฐ ๋ฌด์์ธ์ง ๋งํด ์ค ์ ์์ต๋๊น? ์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ (๊ด๋ จ) ๋ฌธ์ ๊ฐ ์จ์ด์์ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@tzickel ๊ธฐ๋ณธ ์ฐ๋ถํฌ ์ ๋ขฐํ ์์๋ ์ปดํ์ผ๋ฌ๊ฐ gcc 4.8์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ์ต์ ๋ฒ์ ์ด ์ค์น๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
@charris manylinux ์ปจํ ์ด๋๋ gcc 4.2๊ฐ ์ค์น๋ Centos5๋ฅผ ์คํํฉ๋๋ค.
@ngoldbaum ์ ๋ณด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ณง Python 3.7 ์ฉ ํ ์ ๋น๋ํด์ผํฉ๋๋ค. travis.yml ๋น๋ ๋งคํธ๋ฆญ์ค์ MB_PYTHON_VERSION=3.7
ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ๋ง ํผ ์ฌ์ธ๊น์?
manylinux ๋๊ตฌ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. python3.6์ด IIRC๊ฐ ๋์จ ํ ๋ช ์ฃผ๊ฐ ๊ฑธ๋ ธ์ต๋๋ค. @njsmith๋ ์๋ง ๋ ๋ง์ด ์๊ณ ์์ ๊ฒ์ ๋๋ค.
@ngoldbaum gcc 4.2
์ ํ์ ์๋๋ ฅ์ ๋ฌด์์
๋๊น? ์ํ๋ ๊ฒฝ์ฐ ์ต์ ์ปดํ์ผ๋ฌ ๋ฒ์ ์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ฝ์ต๋๊น?
gcc 4.2๋ฅผ ์ ํํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ๋ชฉํ๊ฐ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์ค์ ๋ก ๋ฌธ์ ๊ฐ๋์ง ์์๋งํผ ์ถฉ๋ถํ ์ค๋๋ glibc๋ก ์ปดํ์ผ์ ๊ฐ๋ฅํ๊ฒํ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์ํ๋ ๊ฒฝ์ฐ ์ต์ ์ปดํ์ผ๋ฌ ๋ฒ์ ์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ฝ์ต๋๊น?
๋ชจ๋ฅด๊ฒ ์ด์. ๋๋ ๋ํ numpy๊ฐ ๊ฑด๋ฌผ ๋ฐํด๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋์ง ๋ชจ๋ฆ ๋๋ค. ๋ด ํ๋ก์ ํธ์ Matthew Brett์ ๋ฉํฐ ๋น๋ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ๋ด ํ๋ก์ ํธ์ 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๋ฅผ ํต๊ณผํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ํค๋์ ํธ๋ ์ผ๋ฌ (๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ์ด ์๋๊ธฐ ๋๋ฌธ์ SSEable์ด ์๋)๋ ์๋์ผ๋ก 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์ด ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ์ค ํ๋๋์ด SSE ์ฝ๋์ ๋๋ค (์ต์ ํ๋ฅผ ์ํด์ด ๋ฉ์ปค๋์ฆ์ ๋ค์ง์ต๋๋ค).
# 11029์ ๊ดํด์๋ NaN ์ ํ ๋ฒ๊ทธ ์ธ์๋ ๊ฒ์๋ฌผ์ ์ฌ๊ธฐ ์ ๊ธฐ์์ ๋ชจ๋ ์ ๊ฒฝ๊ณ ๊ฐ ํ์๋๊ณ ๋๋ก๋ ํ์๋์ง ์๋์ง ํ์ ํ๋ ค๊ณ ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ง๋ฌธ์ NaN์ด ์ ๋ ฅ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ต์ / ์ต๋์ ๊ฒฐ๊ณผ์ด๊ณ ์ด๋ฏธ isNan / invalid๋ฅผ ํ์ธํ ๊ฒฝ์ฐ NaN์ ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค๋ฅผ ๋ฐ๊ฒฌ ํ ๋ ๋น ๋ฅด๊ฒ ์ข ๋ฃ๋์ง ์์ต๋๊น?
@tzickel ๊ฐ์ ์์ ์ด ์กฐ๊ธฐ ์ข ๋ฃ๋์ง ์์ต๋๋ค. ๊ทธ๋ค์ gufuncs๋ก ๋ฆฌํฉํ ๋ง๋๋ฉด ๋ฏธ๋์ ํ ์ ์์ต๋๋ค.