Numpy: Windows 10์„ 2004๋กœ ์—…๋ฐ์ดํŠธ ํ•œ ํ›„ polyfit ๋ฐ eig ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจ ํ•จ

์— ๋งŒ๋“  2020๋…„ 07์›” 03์ผ  ยท  171์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

ํ…Œ์ŠคํŠธ ์‹คํŒจ :
FAILED .... libteststest_regression.py::TestRegression::test_polyfit_build-numpy.linalg.LinAlgError : SVD๊ฐ€ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค ...
FAILED .... linalgteststest_regression.py::TestRegression::test_eig_build-numpy.linalg.LinAlgError : ๊ณ ์œ  ๊ฐ’ ...
FAILED .... mateststest_extras.py::TestPolynomial::test_polyfit-numpy.linalg.LinAlgError : SVD๊ฐ€ i ...

์˜ˆ์™ธ ์‚ฌํ•ญ :

err = 'invalid value', flag = 8
    def _raise_linalgerror_lstsq(err, flag):
>       raise LinAlgError("SVD did not converge in Linear Least Squares")
E       numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
err        = 'invalid value'
flag       = 8

๊ณผ

err = 'invalid value', flag = 8
    def _raise_linalgerror_eigenvalues_nonconvergence(err, flag):
>       raise LinAlgError("Eigenvalues did not converge")
E       numpy.linalg.LinAlgError: Eigenvalues did not converge
err        = 'invalid value'
flag       = 8

์ทจํ•œ ์กฐ์น˜ :

  • VM ๋งŒ๋“ค๊ธฐ
  • ์ตœ์‹  Windows 10์„ ์„ค์น˜ํ•˜๊ณ  ์ตœ์‹  ๋ฒ„์ „ 2004 (10.0.19041)๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • Python 3.8.3 ์„ค์น˜
  • pip install pytest
  • pip install numpy
  • pip install hypothesis
  • ํŒจํ‚ค์ง€์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰

์ €์žฅ์†Œ์˜ ํ…Œ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

numpy ๋ฒ„์ „ 1.19.0

์ข…์†์„ฑ์ด ๋ˆ„๋ฝ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ Windows๊ฐ€ ๊ดด๋กญ ํžˆ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

00 - Bug 32 - Installation

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

OpenBLAS v0.3.12์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณ‘ํ•ฉํ–ˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฒ„์ „ + Windows ์—…๋ฐ์ดํŠธ 2004๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ ๋นŒ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  171 ๋Œ“๊ธ€

ํŽธ์ง‘ : ๋‹น์‹ ์€ ๋ถ„๋ช…ํžˆ pip๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ๊ณผ๊ฑฐ์— ์„ ํ˜• ๋Œ€์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ณ ์œ  ๊ฐ’ ๋ถ„ํ•ด (statsmodels ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋งฅ๋ฝ์—์„œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Windows AMD64์—์„œ ์ด์ƒํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด 32 ๋น„ํŠธ Python๊ณผ pip๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. 32 ๋น„ํŠธ ์ฐฝ์—์„œ๋Š” ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ 64 ๋น„ํŠธ ์ฐฝ์—์„œ๋Š” ๋ฐ˜๋ณต ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

MKL์„ ์ œ๊ณตํ•˜๋Š” conda๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : Windows AMD64์—์„œ NumPy 1.18.5๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ตœ์‹  Windows 10 ์—…๋ฐ์ดํŠธ ํ›„ ํ…Œ์ŠคํŠธ ์‹คํŒจ

์—…๋ฐ์ดํŠธ ์ „์— ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจ ํ–ˆ์Šต๋‹ˆ๊นŒ?

@charris ์—†์Œ, ์—…๋ฐ์ดํŠธ ์ „์— ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๊ฐ€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

@speixoto ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์—…๋ฐ์ดํŠธ์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? pip-installed wheels์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ 1809 (10.0.17763)๋กœ ์ธํ•ด @bashtage ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜์ง€

1909 ๋…„์—๋„ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 2004 ๋…„๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด 2004 ๋…„์ด๋‚˜ ๊ทธ ์ดํ›„๋ผ๊ณ  100 % ํ™•์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค. 2004 ๋…„์ด ํšจ๊ณผ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

FWIW CI (Azure ๋˜๋Š” appveyor)์—์„œ ์ด๋Ÿฌํ•œ ์ถฉ๋Œ์„ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์ง€๋งŒ AMD64 ๋ฐ 2004 ๋…„ ์—…๋ฐ์ดํŠธ ์ธ ๋‘ ์ปดํ“จํ„ฐ์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‘˜ ์ค‘ ํ•œ ์‚ฌ๋žŒ์ด 32 ๋น„ํŠธ Python์—์„œ ๊ฐ€์ ธ ์˜ค๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๊นŒ?

2004 ๋…„ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด๋ณด๊ณ  ๋œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„๋ณด๊ณ ํ•ด์•ผํ• ๊นŒ์š”?

1909 ๋ฐ 2004์˜ ์ƒˆ๋กœ ์„ค์น˜์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

pip install numpy scipy pandas pytest cython
git clone https://github.com/statsmodels/statsmodels.git
cd statsmodels
pip install -e . --no-bulid-isolation
pytest statsmodels

1909 ๋…„์—๋Š” ์‹คํŒจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 2004 ๋…„์— 30 ๊ฑด์˜ ์‹คํŒจ๋Š” ๋ชจ๋‘ ์„ ํ˜• ๋Œ€์ˆ˜ ํ•จ์ˆ˜์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2004 ๋…„์— ๋””๋ฒ„๊ฑฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ ์ข…์ข… ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค (๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•ด๋„ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ์œ ์ง€๋จ). ์ด๊ฒƒ์ด ์›์ธ์„ ์ถ”์ธกํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ์ •๋ณด์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์˜ NumPy์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์ด 1.19.0์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

pip + 1.18.4 ๋ฐ scipy 1.4.1์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •๋ง ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

ERROR statsmodels/graphics/tests/test_gofplots.py::TestProbPlotLongely::test_ppplot - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/graphics/tests/test_gofplots.py::TestProbPlotLongely::test_qqplot_other_array - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/graphics/tests/test_gofplots.py::TestProbPlotLongely::test_probplot - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/graphics/tests/test_regressionplots.py::TestPlot::test_plot_leverage_resid2 - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_params - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_scale - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_ess - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_mse_total - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_bic - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_norm_resids - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_HC2_errors - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_missing - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/regression/tests/test_regression.py::TestOLS::test_norm_resid_zero_variance - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/tsa/tests/test_stattools.py::TestADFConstant::test_teststat - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/tsa/tests/test_stattools.py::TestADFConstant::test_pvalue - numpy.linalg.LinAlgError: SVD did not converge
ERROR statsmodels/tsa/tests/test_stattools.py::TestADFConstant::test_critvalues - numpy.linalg.LinAlgError: SVD did not converge

1.18.5 + MKL์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด OpenBLAS ๋ฒ„๊ทธ์ธ์ง€ Windows ๋ฒ„๊ทธ์ธ์ง€ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ›„์ž ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ต๊ณ  ์ง„๋‹จ์€ ์ €์ˆ˜์ค€ ๋””๋ฒ„๊น…์— ๋Œ€ํ•œ ์ œ ๋Šฅ๋ ฅ์„ ๋„˜์–ด์„œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌผ๋ฆฌ์  ์ปดํ“จํ„ฐ์—์„œ pip ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Ubuntu์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ€์žฅ ์ด์ƒํ•œ ํ–‰๋™์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ ์‹คํŒจํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ๋ฐ ํ›„์† ํ˜ธ์ถœ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๋™์ž‘์€ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

svd

๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ : ์ตœ์ ํ™” ๋œ BLAS์—†์ด NumPy์˜ ์†Œ์Šค ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋ฉด ๋™์ผํ•œ ์„ธํŠธ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

OpenBLAS ๊ฐœ๋ฐœ์ž๋ฅผ ํ•‘ํ•  ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. float32์—์„œ float64๋งŒํผ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

NumPy 1.19.0, python -c "import numpy;numpy.test('full')" ์˜ ์ „์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์œ„์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

FAILED Python/Python38/Lib/site-packages/numpy/lib/tests/test_regression.py::TestRegression::test_polyfit_build - numpy.linalg.LinAlgError: SVD did not conv...
FAILED Python/Python38/Lib/site-packages/numpy/linalg/tests/test_regression.py::TestRegression::test_eig_build - numpy.linalg.LinAlgError: Eigenvalues did n...
FAILED Python/Python38/Lib/site-packages/numpy/ma/tests/test_extras.py::TestPolynomial::test_polyfit - numpy.linalg.LinAlgError: SVD did not converge in Lin...

๋‚˜๋Š” ๋‹น์‹ ์ด ๋…์ ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋” ์ด์ƒํ•œ ํ–‰๋™์„ ์˜๋ฏธํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€์„ ํ•‘ํ•˜๋Š” ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ํ†ต๊ณผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Microsoft์— ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

https://aka.ms/AA8xe7q

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ฐพ์„ ๊ฒฝ์šฐ ๊ฒŒ์‹œ :

2004 ๋…„์—์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ Windows ์‚ฌ์šฉ์ž๋Š” Conda / MKL์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ž‘์€ ์žฌํ˜„ ์˜ˆ์ž…๋‹ˆ๋‹ค.

import numpy as np
a = np.arange(13 * 13, dtype=np.float64)
a.shape = (13, 13)
a = a % 17
va, ve = np.linalg.eig(a)

์ƒ์‚ฐ

 ** On entry to DGEBAL parameter number  3 had an illegal value
 ** On entry to DGEHRD  parameter number  2 had an illegal value
 ** On entry to DORGHR DORGQR parameter number  2 had an illegal value
 ** On entry to DHSEQR parameter number  4 had an illegal value
---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
<ipython-input-11-bad305f0dfc7> in <module>
      3 a.shape = (13, 13)
      4 a = a % 17
----> 5 va, ve = np.linalg.eig(a)

<__array_function__ internals> in eig(*args, **kwargs)

c:\anaconda\envs\py-pip\lib\site-packages\numpy\linalg\linalg.py in eig(a)
   1322         _raise_linalgerror_eigenvalues_nonconvergence)
   1323     signature = 'D->DD' if isComplexType(t) else 'd->DD'
-> 1324     w, vt = _umath_linalg.eig(a, signature=signature, extobj=extobj)
   1325
   1326     if not isComplexType(t) and all(w.imag == 0.0):

c:\anaconda\envs\py-pip\lib\site-packages\numpy\linalg\linalg.py in _raise_linalgerror_eigenvalues_nonconvergence(err, flag)
     92
     93 def _raise_linalgerror_eigenvalues_nonconvergence(err, flag):
---> 94     raise LinAlgError("Eigenvalues did not converge")
     95
     96 def _raise_linalgerror_svd_nonconvergence(err, flag):

LinAlgError: Eigenvalues did not converge

LAPACK์€ 0 ๋˜๋Š” 1์—์„œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋“  ์ž˜๋ชป๋œ ๊ฐ’์€ ์ •์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
DGEBAL
DGEHRD
DORGHR
DHSEQR

OpenBlas ๋ฌธ์ œ (๋˜๋Š” 2004 ๋…„๊ณผ OpenBLAS ์‚ฌ์ด์˜ ๋ฌธ์ œ)์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด ์š”์•ฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

NumPy ๋งŒ python -c "import numpy;numpy.test('full')"

  • ์ตœ์ ํ™” ๋œ BLAS ์—†์Œ : ์ „์ฒด ํ†ต๊ณผ
  • OpenBLAS : ์ „์ฒด ์‹คํŒจ
  • MKL : ์ „์ฒด ํ†ต๊ณผ

statsmodels ํ…Œ์ŠคํŠธ pytest statsmodels

  • Pip NumPy ๋ฐ SciPy : SVD ๋ฐ QR ๊ด€๋ จ ์ฝ”๋“œ ๊ด€๋ จ ์‹คํŒจ
  • MKL NumPy ๋ฐ SciPy : ํ†ต๊ณผ
  • ์ตœ์ ํ™” ๋œ BLAS ์—†์Œ : Fail , ๊ทธ๋Ÿฌ๋‚˜ OpenBLAS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” scipy.linalg ๋ฃจํ‹ด๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ๋ณด๋‹ค ๋” ์ ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ ํ™” ๋œ BLAS ์—†์Œ, SciPY linalg ์—†์Œ : ํ†ต๊ณผ

2004 ๋…„์— ๋ฌด์—‡์ด ๋ฐ”๋€Œ ์—ˆ๋Š”์ง€ ๋ฐฐ์šฐ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผ / ๋งํฌ ํ•  ๋•Œ ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”?

_OpenBLAS ๋ฒ„๊ทธ ์ธ ๊ฒฝ์šฐ Windows ๊ธฐ๋ฐ˜ CI๊ฐ€ ๋นŒ๋“œ 19041 (์ผ๋ช… Windows 10 2004) ์ด์ƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ์ด๋Ÿฌํ•œ ๋ณด๊ณ ์„œ ์ค‘ WSL๊ณผ ๊ด€๋ จ๋œ ๋ณด๊ณ ์„œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. conda ์ œ๊ณต python.exe ๋˜๋Š” python.org ์ œ๊ณต python.exe

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ OPENBLAS_CORETYPE=Haswell ๋˜๋Š” OPENBLAS_CORETYPE=NEHALEM ๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๊นŒ?

Atom, SandyBridge, Haswell, Prescott ๋ฐ Nehalem์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ด์ƒํ•œ ์ ์€

import numpy as np
a = np.arange(13 * 13, dtype=np.float64)
a.shape = (13, 13)
a = a % 17
va, ve = np.linalg.eig(a)  # This will raise, so manually run the next line
va, ve = np.linalg.eig(a)

eig ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ (๋ฐ ์ถ”๊ฐ€) ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

SciPy์—๋Š” ๋น„์Šทํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

import numpy as np
import scipy.linalg
a = np.arange(13 * 13, dtype=np.float64)
a.shape = (13, 13)
a = a % 17
va, ve = scipy.linalg.eig(a) 

์ œ๊ธฐํ•˜๋Š”

 ** On entry to DGEBAL parameter number  3 had an illegal value
 ** On entry to DGEHRD  parameter number  2 had an illegal value
 ** On entry to DORGHR DORGQR parameter number  2 had an illegal value
 ** On entry to DHSEQR parameter number  4 had an illegal value
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-58-8dfe8125dfe3> in <module>
      4 a.shape = (13, 13)
      5 a = a % 17
----> 6 va, ve = scipy.linalg.eig(a)

c:\anaconda\envs\py-pip\lib\site-packages\scipy\linalg\decomp.py in eig(a, b, left, right, overwrite_a, overwrite_b, check_finite, homogeneous_eigvals)
    245         w = _make_eigvals(w, None, homogeneous_eigvals)
    246
--> 247     _check_info(info, 'eig algorithm (geev)',
    248                 positive='did not converge (only eigenvalues '
    249                          'with order >= %d have converged)')

c:\anaconda\envs\py-pip\lib\site-packages\scipy\linalg\decomp.py in _check_info(info, driver, positive)
   1348     """Check info return value."""
   1349     if info < 0:
-> 1350         raise ValueError('illegal value in argument %d of internal %s'
   1351                          % (-info, driver))
   1352     if info > 0 and positive:

ValueError: illegal value in argument 4 of internal eig algorithm (geev)

๋งˆ์ง€๋ง‰ ๋ฉ”๋ชจ๋Š” np.complex128 ๋กœ ์ „ํ™˜ํ•˜๋ฉด ์ธ์ƒ๋˜์ง€๋งŒ np.float32 ๋˜๋Š” np.complex64 ํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ธด ์ •์ˆ˜๋กœ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ์˜ Python ๋ถ€๋ถ„์ด์ง€๋งŒ ํฌํŠธ๋ž€ (LAPACK) ๋ถ€๋ถ„์—์„œ INTERFACE64 = 1์—†์ด ๋นŒ๋“œ ๋œ OpenBLAS?
(์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ์‹คํŒจํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์ง€ ์•Š์ง€๋งŒ ํ›„์† ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•˜๋Š” ์ด์œ ์™€ 19041 ์—…๋ฐ์ดํŠธ ์ด์ „์— ์ž‘๋™ ํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

Windows 10 ์‚ฌ์šฉ์ž๋Š” Microsoft์˜ ํ”ผ๋“œ๋ฐฑ ํ—ˆ๋ธŒ์—์„œ์ด ๋ฌธ์ œ๋ฅผ ์ฐฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://aka.ms/AA8xe7q

@bashtage ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ํŒŒํ—ค ์ณค์œผ๋ฉฐ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ƒํƒœ์˜ ์ผ๋ถ€ ์ธก๋ฉด์ด

np.complex128๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ np.float32 ๋˜๋Š” np.complex64๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ (์„ฑ๊ณตํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Œ) "DGEBAL ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฒˆํ˜ธ 3์— ์ž˜๋ชป๋œ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค."๋Š”์ด ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/xianyi/OpenBLAS/blob/ce3651516f12079f3ca2418aa85b9ad571c3a391/lapack -netlib / SRC / dgebal.f # L336 ์ด๋Š” NaN์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ด์ „ ๊ณ„์‚ฐ์— ์˜ํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๋ฉด์„œ mod๋ฅผ float32๋กœ "์ˆ˜์ •"ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

import numpy as np
a = np.arange(13 * 13, dtype=np.float64)
a.shape = (13, 13)
a = (a.astype(np.float32) % 17).astype(np.float64) # <-- only line changed
va, ve = np.linalg.eig(a)

๊ทธ๋ž˜์„œ ์ œ ์ƒ๊ฐ์—๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ์— ์ƒํƒœ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. numpy์˜ ๋‚ด๋ถ€์— ๋” ์ต์ˆ™ํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์ด ์–ด๋””์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Kind of๋Š” WIndows์—์„œ mingw๋กœ ๋ณด์•˜๋˜ ์˜ค๋ž˜๋œ ๋ฒ„๊ทธ๋ฅผ ์ƒ๊ธฐ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ ˆ์ง€์Šคํ„ฐ ๊ตฌ์„ฑ์ด ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์ƒ์†๋˜์ง€ ์•Š์•„ ๋น„์ •๊ทœ ํ•ญ๋ชฉ์ด 0์œผ๋กœ ํ”Œ๋Ÿฌ์‹œ๋˜์ง€ ์•Š๊ณ  ํ›„์† ๊ณ„์‚ฐ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ํ˜„์žฌ ํ•˜๋“œ์›จ์–ด์˜ ํ˜„์žฌ Windows์™€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ
OpenBLAS ๋นŒ๋“œ๋Š” CONSISTENT_FPCSR = 1๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ํ•ด๋‹น ๋นŒ๋“œ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด๋˜๋Š” ๊ฒฝ์šฐ).

@mattip OpenBLAS ๋นŒ๋“œ์—์„œ CONSISTENT_FPCSR = 1์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ?

์•ˆํƒ€๊น๊ฒŒ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

https://github.com/MacPython/openblas-libs/blob/444203b6dff90c2f0d2304fb3d85e1ac6db5c1e8/appveyor/build_openblas.sh#L68

๊ธ€์Ž„, ์ ์–ด๋„ ์ด๊ฒƒ์€ ๊ธธ์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์—ฐ๊ฒฐ์€ ์ƒ๋‹นํžˆ ๋จผ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”! ๋‚˜๋Š” ํ•œ๋™์•ˆ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์–ด ์™”์œผ๋ฉฐ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋Š” Windows 10 (2004)๊ณผ OpenBlas ์‚ฌ์ด์— ๋ญ”๊ฐ€ ์ด์ƒํ•œ ์ ์„ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋ณดํ†ต 3 ๋Œ€์˜ PC (2 ๋Œ€์˜ Windows 10 ์›Œํฌ ์Šคํ…Œ์ด์…˜๊ณผ ๊ตฌํ˜• Windows 7 ๋…ธํŠธ๋ถ)์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด Python ์Šคํฌ๋ฆฝํŠธ๋Š” 2 ๊ฐœ์˜ ์›Œํฌ ์Šคํ…Œ์ด์…˜์„ Windows 10 ๋ฒ„์ „ 2004๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ๋•Œ linalg ๋ฐ svd () ์ˆ˜๋ ด๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋กœ ์˜ค์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค (Jupyter ๋…ธํŠธ๋ถ ์‹คํ–‰). ์˜ค๋ž˜๋œ ๋žฉํ†ฑ ์žฅ๋น„๋Š” ์˜ค๋ฅ˜์—†์ด ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ„์† ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” miniconda, python 3.6์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค (env๋Š” 3 ๋Œ€์˜ ์ปดํ“จํ„ฐ์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค).
์˜ค๋Š˜์€ ํ• ๊ธฐ๋ณธ NumPy์™€ (1.19.0) ์„ค์น˜๋ฅผ ์ œ๊ฑฐ์—์„œ NumPy์™€ + MKL (NumPy์™€-1.19.1 + MKL-cp36-cp36m-win_amd64.whl) ๋ฒ„์ „์„ ์„ค์น˜ https://www.lfd.uci.edu/ ~ gohlke / pythonlibs /. ์ง€๊ธˆ๊นŒ์ง€ linalg ๋ฐ svd () ์ˆ˜๋ ด๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์„ ์ฐพ์œผ๋ฉด ์—ฌ๊ธฐ๋กœ ๋Œ์•„์™€๋ณด๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฆฌ์˜ค

OpenBLAS dll์ด lib.exe์˜ VC9 ๋ฒ„์ „์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ Python 2.7์—์„œ ์‚ฌ์šฉ ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ VC9๊ฐ€ ์–ด๋””์—๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ (์•„๋งˆ๋„ ๋‚˜)์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ OpenBLAS ( USE_THREAD=0 )๋กœ NumPy ๋งˆ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ USE_THREADS=0 ๋น„ํ™œ์„ฑํ™”
  • ILP64 INTERFACE64=1 <-์•ก์„ธ์Šค ์œ„๋ฐ˜์ด์žˆ๋Š” NumPy ํ…Œ์ŠคํŠธ์˜ Segfault

Win10 ์„ค์ •์œผ๋กœ LAPACK ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ตœ๊ทผ์— ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด cmake ๋นŒ๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ, ์•„๋งˆ๋„ numpy๊ฐ€ ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  ์•ฝ๊ฐ„์˜ ๋‹จ์„œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

                        -->   LAPACK TESTING SUMMARY  <--
SUMMARY                 nb test run     numerical error         other error
================        ===========     =================       ================
REAL                    409288          0       (0.000%)        0       (0.000%)
DOUBLE PRECISION        410100          0       (0.000%)        0       (0.000%)
COMPLEX                 420495          0       (0.000%)        0       (0.000%)
COMPLEX16               13940           0       (0.000%)        0       (0.000%)

--> ALL PRECISIONS      1253823         0       (0.000%)        0       (0.000%)

๊ฐ™์€ ์ค„์ด ๋งŽ์ด ๋ณด์ด์ง€๋งŒ

-->  Testing DOUBLE PRECISION Nonsymmetric Eigenvalue Problem [ xeigtstd < nep.in > dnep.out ]
---- TESTING ./xeigtstd... FAILED(./xeigtstd < nep.in > dnep.out did not work) !

๊ทธ๋ž˜์„œ ์ด๊ฒƒ๋“ค์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ธ๊ทธ ํดํŠธ ์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‚ด์•„๋‚จ์€ ํ…Œ์ŠคํŠธ๋Š” ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค ... ์ด๊ฒƒ์€ ์ œ๊ฐ€ ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ทน๋‹จ์ ์ž…๋‹ˆ๋‹ค.
(COMPLEX ๋ฐ COMPLEX16์€ ์Šคํƒ ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ OS ์„ค์ •์œผ๋กœ ์‹คํŒจ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋” ๋†’์ง€๋งŒ REAL ๋ฐ DOUBLE์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฝ 1200000 ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. MS๊ฐ€ ๊ธฐ๋ณธ ์Šคํƒ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ)

์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ. ๋ชจ๋“  ๊ฒƒ์€ gcc.exe / gfortran.exe๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ .a ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ทธ ํ›„ DLL๋กœ ํŒจํ‚ค์ง•๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ํŠน๋ณ„ํžˆ:

$ gcc -v
Using built-in specs.
COLLECT_GCC=C:\git\numpy-openblas-windows\openblas-libs\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/git/numpy-openblas-windows/openblas-libs/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/7.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-7.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw710/prerequisites/x86_64-zlib-static/include -I/c/mingw710/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw710/prerequisites/x86_64-zlib-static/include -I/c/mingw710/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw710/prerequisites/x86_64-zlib-static/include -I/c/mingw710/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/lib -L/c/mingw710/prerequisites/x86_64-zlib-static/lib -L/c/mingw710/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: posix
gcc version 7.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

$ gfortran -v
Using built-in specs.
COLLECT_GCC=C:\git\numpy-openblas-windows\openblas-libs\mingw64\bin\gfortran.exe
COLLECT_LTO_WRAPPER=C:/git/numpy-openblas-windows/openblas-libs/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/7.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-7.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw710/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw710/prerequisites/x86_64-zlib-static/include -I/c/mingw710/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw710/prerequisites/x86_64-zlib-static/include -I/c/mingw710/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw710/prerequisites/x86_64-zlib-static/include -I/c/mingw710/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw710/x86_64-710-posix-seh-rt_v5-rev0/mingw64/opt/lib -L/c/mingw710/prerequisites/x86_64-zlib-static/lib -L/c/mingw710/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: posix
gcc version 7.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

NumPy์™€ OpenBLAS ๊ฐ„์˜ ํ•ธ๋“œ ์˜คํ”„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ์˜ค๋ฅ˜ ์ธ ๊ฒฝ์šฐ์ด ๋™์ž‘์ด ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ์ƒํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ๋ฐ ํ›„์† ํ˜ธ์ถœ์€ ๋ชจ๋‘ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• (๋˜๋Š” TBH๊ฐ€ ๊นŠ์€ ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง„๋‹จ) ...?

MS ํ”Œ๋žซํผ์„ ํ์ง€ํ•˜๊ณ  ํ–‰๋ณตํ•˜๊ฒŒ ์‚ด์•„ ๊ฐ€์„ธ์š”? ์‹คํŒจํ•˜๋ฉด Lapack ํ…Œ์ŠคํŠธ๋Š” Fortran (= OpenBLAS์˜ LAPACK ๋ถ€๋ถ„)๊ณผ C ๋˜๋Š” Fortran๊ณผ "๋‹ค๋ฅธ ๊ฒƒ"์‚ฌ์ด์— ํ•ธ๋“œ ์˜คํ”„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

icc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenBLAS๋กœ Numpy๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ž˜๋„ ํฐ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

2020 ๋…„ 8 ์›” 12 ์ผ ์ˆ˜์š”์ผ 19:04 Martin Kroeker [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

MS ํ”Œ๋žซํผ์„ ํ์ง€ํ•˜๊ณ  ํ–‰๋ณตํ•˜๊ฒŒ ์‚ด์•„ ๊ฐ€์„ธ์š”? ์‹คํŒจํ•˜๋ฉด
lapack์€ Fortran (= LAPACK์˜ ์ผ๋ถ€
OpenBLAS) ๋ฐ C ๋˜๋Š” Fortran ๋ฐ "๊ธฐํƒ€".

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/16744#issuecomment-673026759 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ABKTSRLSHZ2XWF4OE7J3QO3SALKSJANCNFSM4OP5IXNQ
.

์ธํ…” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ OpenBLAS๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ตœ์†Œํ•œ ์ตœ๊ทผ์— ๋‚˜์˜จ VS์—์„œ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ˜„์žฌ ifc / ifort์— ๋Œ€ํ•œ ์œ ํšจํ•œ ๋ผ์ด์„ผ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2004 ๋…„์—์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ Windows ์‚ฌ์šฉ์ž๋Š” Conda / MKL์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@bashtage ์ œ์•ˆ
์ œ ๊ฒฝ์šฐ์—๋Š” Conda ๋ฒ„์ „์˜ numpy๋ฅผ ์ ์šฉํ•œ ํ›„ pandasql์„ ์‚ฌ์šฉํ•˜์—ฌ sqlite๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ์ด ๋ฒ„์ „์˜ numpy + mkl์„ ์‚ฌ์šฉํ•  ๋•Œ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@bashtage ๋…น ๋งํฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด์žˆ๋Š” ์ƒˆ๋กœ์šด MSVC ํ”„๋ฆฌ ๋ฆด๋ฆฌ์ฆˆ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฐธ๊ณ  : ๊ด€๋ จ SciPy ๋ฌธ์ œ : https://github.com/scipy/scipy/issues/12747

Windows ๋นŒ๋“œ 17763.1397 (8 ์›” 11 ์ผ)์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๋Š”๋ณด๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. # 17082๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Windows ๋นŒ๋“œ 17763.1397 (8 ์›” 11 ์ผ)์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๋Š”๋ณด๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. # 17082๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

https://support.microsoft.com/en-us/help/4565349/windows-10-update-kb4565349

๋นŒ๋“œ 17763.1397์€ Windows 10, ๋ฒ„์ „ 1809 ์ „์šฉ์ž…๋‹ˆ๋‹ค (์ ์šฉ ๋Œ€์ƒ : Windows 10, ๋ฒ„์ „ 1809, ๋ชจ๋“  ๋ฒ„์ „ Windows Server ๋ฒ„์ „ 1809Windows Server 2019, ๋ชจ๋“  ๋ฒ„์ „).
์ด ๊ฒฝ์šฐ Windows 10 ๋ฒ„์ „ 1809์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Windows 10, ๋ฒ„์ „ 2004์˜ ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.
https://support.microsoft.com/en-us/help/4566782
2020 ๋…„ 8 ์›” 11 ์ผ-KB4566782 (OS ๋นŒ๋“œ 19041.450).

Windows 10, ๋ฒ„์ „ 2004์—์„œ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

image

19042.487์—์„œ ๋™์ผํ•œ ์‹คํŒจ (20H2 ์ง€์ ) :

-- Docs: https://docs.pytest.org/en/stable/warnings.html
=============================================== short test summary info ===============================================
FAILED lib/tests/test_regression.py::TestRegression::test_polyfit_build - numpy.linalg.LinAlgError: SVD did not conve...
FAILED linalg/tests/test_regression.py::TestRegression::test_eig_build - numpy.linalg.LinAlgError: Eigenvalues did no...
FAILED ma/tests/test_extras.py::TestPolynomial::test_polyfit - numpy.linalg.LinAlgError: SVD did not converge in Line...
3 failed, 11275 passed, 559 skipped, 20 xfailed, 1 xpassed, 1 warning in 398.16s (0:06:38)

๋‚˜๋Š” OpenBLAS์˜ lapack-test์—์„œ (๋ถ€๋ถ„์ ์ธ) ์‹คํŒจ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค-๋น„์ •์ƒ์ ์œผ๋กœ ๋†’์€ ์Šคํƒ ํฌ๊ธฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ EIG (๊ณ ์œ  ๊ฐ’) ํ…Œ์ŠคํŠธ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. SIGSEGV๋Š” main () ์ด์ „์—๋„ ์ž…๋ ฅ ๋œ __chkstk_ms_์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. peflags ์œ ํ‹ธ๋ฆฌํ‹ฐ (์˜ˆ : peflags -x4194304 -X4194304 EIG/xeigtsts.exe )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์‹คํ–‰ ํŒŒ์ผ์˜ ๊ธฐ๋ณธ "์Šคํƒ ์˜ˆ์•ฝ ํฌ๊ธฐ"๋ฐ "์Šคํƒ ์ปค๋ฐ‹ ํฌ๊ธฐ"๊ฐ’์„ ๋‘ ๋ฐฐ๋กœ ์„ค์ •ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ C / Fortran ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ์ธ์ˆ˜ ์ „๋‹ฌ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ์ด๊ฒƒ์„ numpy ์ผ€์ด์Šค์— ์ ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ (๋ˆ„๊ตฌ์˜ peflag ์„ค์ •์„ ์กฐ์ •ํ• ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•จ-python.exe?) 19041.450 ์ผ๋ช… gcc 9.1.0์˜ msys2 mingw64 ๋ฒ„์ „์œผ๋กœ ๋นŒ๋“œํ–ˆ์„ ๋•Œ OpenBLAS ์ž์ฒด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. 2004 ๋…„

@ martin-frbg ์ง„ํ–‰ ์ƒํ™ฉ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Windows / MSYS2์—์„œ numpy๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ํ† ๋ผ ๊ตฌ๋ฉ์— ๋น ์ ธ ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@ martin-frbg, Msys2 ๊ธฐ๋ฐ˜ numpy ํŒจํ‚ค์ง€๋Š” pacman๊ณผ ํ•จ๊ป˜ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Msys2 ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ํŒจ์น˜๋Š” https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-python-numpy ๋ฐ https://github.com/msys2/MINGW-packages/tree์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ ๋ถ„๋ฅ˜ ํšŒ์˜์—์„œ ์ด๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋กœ ๋‚˜ํƒ€ ๋‚ฌ ์œผ๋ฉฐ

@bashtage editbin /STACK:3145728 python.exe ์Šคํƒ์„ ๋” ํฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ๋นŒ๋“œํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹  OpenBLAS์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฆด๋ฆฌ์Šค๋กœ NumPy๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ์šฐ๋ฆฌ์˜ ๋นŒ๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ์˜ libopenblas.dll์„ ํ˜„์žฌ develop ๋ธŒ๋žœ์น˜ ๋˜๋Š” 0.3.8 ๋˜๋Š” 0.3.9์™€ ๊ฐ™์€ ์ด์ „ ๋ฆด๋ฆฌ์Šค์—์„œ ๋งŒ๋“  ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ง€๊ธˆ ๋‹น์žฅ ์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ํŠน์ • ์ปค๋ฐ‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.) ๋ถˆํ–‰ํžˆ๋„ msys2 ํŒจํ‚ค์ง€์—์„œ๋„ ์—ฌ์ „ํžˆ ์„ค์น˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ˜„์žฌ self.ld_version์ด ๋ฒ„์ „ ๊ฒ€์‚ฌ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ. 2004 ๋…„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฐฝ๋ฌธ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ง ์ „์— ๋๋‚ด๋Š”์ง€ ๋ด…์‹œ๋‹ค.

๋˜ํ•œ https://github.com/numpy/numpy/issues/16744#issuecomment -655430682์˜ bashtage์˜ "์ž‘์€ ์žฌํ˜„ ์˜ˆ์ œ"๋Š” ๋‚ด msys2 ์„ค์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ, mingw64 / usr / lib์˜ libopenblas๋Š” Haswell์„ ์œ„ํ•ด ๋นŒ๋“œ ๋œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ 0.3.10์ž…๋‹ˆ๋‹ค)

@ martin-frbg MSVC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenBLAS๋ฅผ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ๋ฐ˜ MSVC? ๊ฐ€๋Šฅํ•˜์ง€๋งŒ MSVC๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ ์ปค๋„์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. TARGET = GENERIC ์šฉ์œผ๋กœ OpenBLAS๋ฅผ ๋นŒ๋“œ ํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ # 16744 (์ฃผ์„) ์˜ bashtage์˜ "์ž‘์€ ์žฌํ˜„ ์˜ˆ์ œ"๋Š” ๋‚ด msys2 ์„ค์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ, mingw64 / usr / lib์˜ libopenblas๋Š” Haswell์„ ์œ„ํ•ด ๋นŒ๋“œ ๋œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ 0.3.10์ž…๋‹ˆ๋‹ค)

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด NumPy์™€ OpenBLAS ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. NumPy์˜ 32 ๋น„ํŠธ ๋นŒ๋“œ์—๋„์ด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ๋ฌธ์ œ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” Microsoft ์ง์›์˜ ์•„์ด๋””์–ด๊ฐ€ ๊ฐ€์žฅ ๊ทธ๋Ÿด๋“ฏํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์— ์ž˜๋ชป๋œ ๊ฐ’์ด ์กด์žฌํ•˜๊ณ  ํ›„์† ํ˜ธ์ถœ์—์„œ ์ˆ˜์ •๋˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Windows / MSYS2์—์„œ numpy๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ํ† ๋ผ ๊ตฌ๋ฉ์— ๋น ์ ธ ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ณ ํ†ต์ž…๋‹ˆ๋‹ค. ํ•ด๋ดค์ง€๋งŒ ์‹คํ—˜์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ https://github.com/MacPython/openblas-libs ์—์„œ ๋‹จ๊ณ„๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ .a ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ https://github.com/numpy/numpy/blob/master/ ์—์„œ ๋‹จ๊ณ„๋ฅผ ๋ณต์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

DLL ๋นŒ๋“œ๋ฅผ ์–ป๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ appveyor ๊ณ„์ •์„ ์—ฐ ๋‹ค์Œ https://github.com/MacPython/openblas-libs ๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ฒƒ

https://github.com/MacPython/openblas-libs๋ฅผ ๋ณด๋ฉด OpenBLAS๊ฐ€ INTERFACE64=1 ๋กœ ๋นŒ๋“œ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Msys2 ๋นŒ๋“œ OpenBLAS ๋ฐ numpy์˜ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค .

@carlkl ์ด ๋ฌธ์ œ๋Š” NumPy ๋˜๋Š” OpenBLAS์˜ Msys2 ๋นŒ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” Msys2์—์„œ ์ œ๊ณต ํ•œ gfortran์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌํŠธ๋ž€ ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผ ํ•œ ๋‹ค์Œ MS์˜ lib.exe๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Win32 DLL์„ ๋นŒ๋“œํ•˜๋Š” Win32 / AMD64 ๋นŒ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ณด๊ณ  ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— @bashtage ๋‚˜๋Š”์ด ์–ธ๊ธ‰ https://github.com/numpy/numpy/issues/16744#issuecomment ๋Š” segfault๊ฐ€ msys2 ๋‚ด์—์„œ ์žฌ์ƒ๋˜์ง€ ์ˆ˜, -689785607. ๊ทธ๋ฆฌ๊ณ  ์–ธ๊ธ‰ ๋œ msys2 ํ™˜๊ฒฝ์—๋Š” msys2 ์ œ๊ณต openblas ๋ฐ numpy ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Windows 64bit numpy๊ฐ€ MSVC์™€ ์œ ์‚ฌํ•œ ํ”Œ๋ž˜๊ทธ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

BTW : scipy ์ €์žฅ์†Œ์—์„œ -fdefault-integer-8 ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
-fdefault-integer-8 ๋กœ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๊ฐ€์ด ํ”Œ๋ž˜๊ทธ์—†์ด ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ์™€ ABI ํ˜ธํ™˜๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ธก๋ฉด์ด ๋–  ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. -fdefault-integer-8 ๋Š” -mcmodel=large ์™€ ๊ฒฐํ•ฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค : Windows64์—๋Š” ILP64๊ฐ€ ์•„๋‹Œ LLP64 ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
LLP64๋Š” long : 32bit, ํฌ์ธํ„ฐ : 64bit๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Win10-2004 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” numpy ๋นŒ๋“œ๋Š” ์–ด๋–ค ํฌ๊ธฐ์˜ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? OpenBLAS๊ฐ€ ๊ตฌ์ถ• ํ•œ ๊ฒƒ๊ณผ ๋” ์ž˜ ์ผ์น˜ํ–ˆ์ง€๋งŒ IIRC์ด ์ฃผ์ œ๋Š” ์ด๋ฏธ์ด ์Šค๋ ˆ๋“œ์˜ ์ดˆ๊ธฐ์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค (๋ถˆ์ผ์น˜๋กœ ์ธํ•ด Windows ํŒจ์น˜ ์ˆ˜์ค€์— ๊ด€๊ณ„์—†์ด ๋” ๋šœ๋ ทํ•œ ์†์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์ตœ์†Œํ•œ Openblas๋Š” https://github.com/MacPython/openblas-libs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๊ฐ€์ง€ ๋ณ€ํ˜•์œผ๋กœ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (appveyor.yml ์ฐธ์กฐ).

  • 32 ๋น„ํŠธ
  • 64 ๋น„ํŠธ
  • INTEGER64๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 64 ๋น„ํŠธ

๊ทธ๋Ÿฌ๋‚˜ Windows์—์„œ numpy 64bit ๋นŒ๋“œ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด.

_ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด Windows ํŒจ์น˜ ์ˆ˜์ค€์— ๊ด€๊ณ„์—†์ด ๋” ๋šœ๋ ทํ•œ ์†์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค _

-fdefault-integer-8 ๋Š” Lapack์˜ ํฌํŠธ๋ž€ ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ (LLP64)์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Fortran Lapack ๋ถ€ํ’ˆ ์™ธ๋ถ€์—์„œ ๋ฌธ์ œ๋ฅผ ์˜ˆ์ƒํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ ,

https://github.com/numpy/numpy/blob/60a21a35210725520077f13200498e2bf3198029/azure-pipelines.yml ๋ผ๊ณ 

- job: Windows pool: vmImage: 'VS2017-Win2016' ... Python38-64bit-full: PYTHON_VERSION: '3.8' PYTHON_ARCH: 'x64' TEST_MODE: full BITS: 64 NPY_USE_BLAS_ILP64: '1' OPENBLAS_SUFFIX: '64_'
๋‹ค๋ฅธ ๋ชจ๋“  ๋ฒ„์ „ ( Python36-64bit-full , Python37-64bit-full )์€ NPY_USE_BLAS_ILP64์—†์ด ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

pypi.org์˜ Numpy ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋ชจ๋‘ 32 ๋น„ํŠธ ์ •์ˆ˜ openbla๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. https://github.com/MacPython/numpy-wheels/blob/v1.19.x/azure/windows.yml

๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค gfortran ๋Œ€ MSVC ์„ธ๋ถ€ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ openblas.a ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  gfortran์„ ์‚ฌ์šฉํ•˜์—ฌ DLL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. https://github.com/numpy/numpy/blob/74712a53df240f1661fbced15ae984888fd9afa6/numpy/distutils/fcompiler/gnu.py#L442 MSVC ๋„๊ตฌ๋Š” .def ํŒŒ์ผ์—์„œ .lib ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ MSVC๋กœ ์ปดํŒŒ์ผ ๋œ Numpy C ์ฝ”๋“œ .lib ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ gfortran์—์„œ ์ƒ์„ฑ ํ•œ DLL์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ž˜๋ชป ๋  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ์ด๋ก ์  ๊ฐ€๋Šฅ์„ฑ์€ ์ •์  openblas.a ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ƒ์„ฑ ํ•œ mingw์™€ numpy๊ฐ€ ๋นŒ๋“œ ๋  ๋•Œ ์‚ฌ์šฉ ๋œ mingw ๋ฒ„์ „๊ฐ„์— ์ผ์ข…์˜ mingw ๋ฒ„์ „ ๋ถˆ์ผ์น˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

choco install -y mingw --forcex86 --force --version=5.3.0 ์— ์‚ฌ์šฉ๋˜๋Š” windows.yml ๋ณด์ธ๋‹ค๋Š” ์˜ค๋ž˜๋œํ•ฉ๋‹ˆ๋‹ค. 7.3.0 ๋˜๋Š” 8.1.0 ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 2 ~ 3 ๋…„ ์ „์— gcc-5.x์—์„œ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

choco install -y mingw --forcex86 --force --version = 5.3.0 windows.yml์—์„œ ์‚ฌ์šฉ ๋œ ๊ฒƒ์ด ์˜ค๋ž˜๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋Š” 32 ๋น„ํŠธ Windows ๋นŒ๋“œ ์ „์šฉ์ด๋ฏ€๋กœ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ๋ฒ„์ „ ( Python36-64bit-full , Python37-64bit-full )์€ NPY_USE_BLAS_ILP64์—†์ด ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

Python 3.6 ๋ฐ 3.8์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค (๋‚˜๋Š” ์–ด๋‘  ์†์—์„œ ํŒŒ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) :

OpenBLAS๋Š” ์ด์ œ -fno-optimize-sibling-calls ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. https://github.com/xianyi/OpenBLAS/issues/2154 , https://github.com/xianyi/OpenBLAS/pull/2157 ๋ฐ https : // gcc ์ฐธ์กฐ .gnu.org / bugzilla / show_bug.cgi? id = 90329.
ํŽธ์ง‘ : ์ฐธ์กฐ : https://gcc.gnu.org/legacy-ml/fortran/2019-05/msg00181.html

Numpy๋Š” distutils์˜ gfortran ๋ถ€๋ถ„์—์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. numpy๊ฐ€ MSVC๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ numpy๋ณด๋‹ค๋Š” scipy์— ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์€ ๋‹ค์‹œ ์ž˜๋ชป๋œ ์—ฌํ–‰ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pypi.org์˜ Numpy ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋ชจ๋‘ 32 ๋น„ํŠธ ์ •์ˆ˜ openbla๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. https://github.com/MacPython/numpy-wheels/blob/v1.19.x/azure/windows.yml

ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ ๋œ ๋นŒ๋“œ ๊ตฌ์„ฑ์ด ๋ฆด๋ฆฌ์Šค์— ์‚ฌ์šฉ ๋œ ๊ตฌ์„ฑ๊ณผ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์œ„ํ—˜์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

Azure ๋นŒ๋“œ์— ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฐ”ํ€ด๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฌด๋ฃŒ ์•„ํ‹ฐํŒฉํŠธ ์ œํ•œ์ด IIRC, 1GB๋กœ ๋งค์šฐ ์ž‘์œผ๋ฉฐ์ด๋ฅผ ๋•Œ๋ ธ์„ ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (FIFO๋Š” ์ข‹์ง€๋งŒ ์˜ค๋ฅ˜๋ฅผ ํฌํ•จํ•œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Œ).

ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ ๋œ ๋นŒ๋“œ ๊ตฌ์„ฑ์ด ๋ฆด๋ฆฌ์Šค์— ์‚ฌ์šฉ ๋œ ๊ตฌ์„ฑ๊ณผ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

NPY_USE_BLAS_ILP64 ์—†๋Š” Windows์—์„œ ์ง€์›๋˜๋Š” ๋ชจ๋“  Python ๋ฒ„์ „์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  NPY_USE_BLAS_ILP64 ๋กœ Python 3.8๋„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค ( https://github.com/numpy/numpy/blob/v1.19.2/azure ์ฐธ์กฐ). -pipelines.yml # L195. ๋”ฐ๋ผ์„œ ์ฃผ๊ฐ„ ๋นŒ๋“œ๋Š” 32 ๋น„ํŠธ ์ •์ˆ˜ openbla๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

Azure ๋นŒ๋“œ์— ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋งˆ ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•œ๊ณ„์— ๋Œ€ํ•ด ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฃผ๊ฐ„ ํœ ์€ ํ…Œ์ŠคํŠธ ๋นŒ๋“œ๋ฅผ ์ถฉ์‹คํžˆ ์žฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถˆ์ผ์น˜๋Š” ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ์ˆ˜์ •๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•œ๊ณ„์— ๋Œ€ํ•ด ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฃผ๊ฐ„ ํœ ์€ ํ…Œ์ŠคํŠธ ๋นŒ๋“œ๋ฅผ ์ถฉ์‹คํžˆ ์žฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถˆ์ผ์น˜๋Š” ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ์ˆ˜์ •๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ PR์—์„œ ์‹คํ—˜ํ•˜๊ณ  2004 ๋…„์— ํ…Œ์ŠคํŠธ ํ•  ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ง์ด๋œ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ bashtage / numpy์—์„œ Azure ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ •๋ณด : ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ์‹คํŒจํ•œ ์ด์œ ๋Š” OpenBLAS ๋‚ด๋ถ€์—์„œ DNRM2 ๊ฐ€ NAN์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ €์—๊ฒŒ ์ด๊ฒƒ์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

a = np.arange(13 * 13, dtype=np.float64).reshape(13, 13)
a = a % 17
np.linalg.eig(a)

** On entry to DGEBAL parameter number 3 had an illegal value ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” " DNRM2 returned NAN"์„ ๋งํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. mod ์ž‘์—…์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.์ด ์ž‘์—…์ด ์—†์œผ๋ฉด eig ํ˜ธ์ถœํ•ด๋„์ด ์˜ค๋ฅ˜๊ฐ€ ์ธ์‡„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

mod ufunc์™€ OpenBLAS ํ˜ธ์ถœ๊ฐ„์— ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

mod ์ž‘์—…์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.์ด ์ž‘์—…์ด ์—†์œผ๋ฉด eig ํ˜ธ์ถœํ•ด๋„์ด ์˜ค๋ฅ˜๊ฐ€ ์ธ์‡„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ์–ด๋ ˆ์ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

์ด ์ฝ”๋“œ๋Š” ์‹คํŒจ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

a = np.array([x % 17 for x in range(13 * 13)], dtype=np.float64)
a.shape = (13, 13)
np.linalg.eig(a)

์•ž์˜ mod ๊ฐ€ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? nrm2.S๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ช‡ ๋…„ ์ „ ์–ด์…ˆ๋ธ”๋ฆฌ XOR์—์„œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ž์ฒด์ ์œผ๋กœ XORํ•˜์—ฌ์ด๋ฅผ ์ง€์šฐ๋Š” ๋ฐ ๋ช‡ ๋…„ ์ „ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” NaN์—์„œ ์‹คํŒจ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ๋”ฐ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ float64 % ๋Š” ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด npy_divmod ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

... ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ npy_fmod() ํ˜ธ์ถœํ•˜๋ฉฐ ์ด๋Š” fmod () ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. "์˜ค๋ฅ˜"๋Š” a % 17; np.linalg.eig(a) ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ OpenBLAS์—์„œ "์ž˜๋ชป๋œ ๊ฐ’"๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ | ๊ฒฐ๊ณผ
--- | ---
mod = npy_fmod@c@(a, b); (์›๋ž˜ ์ฝ”๋“œ) | ์˜ค๋ฅ˜
mod = 100; //npy_fmod@c@(a, b); | ์˜ค๋ฅ˜ ์—†์Œ
mod = npy_fmod@c@(a, b); mod = 100.0; | ์˜ค๋ฅ˜

๋”ฐ๋ผ์„œ MSVC์˜ fmod ๊ฐ€ OpenBLAS๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒํ•˜๋Š” ์ผ์„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ณ  ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

fmod์˜ ์ˆœ์ง„ํ•œ (ํ”Œ๋žซํผ์ด ์ œ๊ณต๋˜์ง€ ์•Š์Œ) ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜๋Š” HAVE_MODF ๋ฅผ 0 ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

fmod์˜ ์ˆœ์ง„ํ•œ ๋ฒ„์ „์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

HAVE_MODF ๋งคํฌ๋กœ๊ฐ€ ์žˆ์ง€๋งŒ ์ด ๊ฒฝ๋กœ ๋Š” ์–ด๋””๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

float์™€ long double์ด ๋ˆ„๋ฝ๋˜๋ฉด ์ด์ค‘ ๋ฒ„์ „์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. numpy๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด ์ด์ค‘ ๋ฒ„์ „์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. undef๋Š” ์•„๋งˆ๋„ ์˜ค๋ž˜ ์ „์— Windows์—์„œ ๋ฌธ์ œ์˜€๋˜ ์ปดํŒŒ์ผ๋Ÿฌ ์ธ๋ผ์ธ ํ•จ์ˆ˜ ์ธ ISTR์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ucrtbase.dll ์—์„œ ๋น„๋กฏ๋œ fmod ๊ตฌํ˜„์ž„์„ "์ฆ๋ช…"ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ctypes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ dll์—์„œ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  fmod ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ์•ฝ๊ฐ„์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ucrtbase.dll ์˜ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค ( fmod ํ•จ์ˆ˜์—๋งŒ ํ•ด๋‹น). ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. Visual Studio ํฌ๋Ÿผ ์—์„œ

diff --git a/numpy/core/src/npymath/npy_math.c b/numpy/core/src/npymath/npy_math.c
index 404cf67b2..675905f73 100644
--- a/numpy/core/src/npymath/npy_math.c
+++ b/numpy/core/src/npymath/npy_math.c
@@ -7,3 +7,27 @@

 #define NPY_INLINE_MATH 0
 #include "npy_math_internal.h"
+#include <Windows.h>
+
+typedef double(*dbldbldbl)(double, double);typedef double(*dbldbldbl)(double, double);
+
+dbldbldbl myfmod = NULL;
+
+typedef double(*dbldbldbl)(double, double);
+extern dbldbldbl myfmod;
+
+
+double __fmod(double x, double y)
+{
+    if (myfmod == NULL) {
+        HMODULE dll = LoadLibraryA("ucrtbase_old.dll");
+        //HMODULE dll = LoadLibraryA("c:\\windows\\system32\\ucrtbase.DLL");
+         myfmod = (dbldbldbl)GetProcAddress(dll, "fmod");
+    }
+    return myfmod(x, y);
+}
+
+long double __fmodl(long double x, long double y) { return fmodl(x, y); }
+float __fmodf(float x, float y) { return fmodf(x, y); }
+
+
diff --git a/numpy/core/src/npymath/npy_math_internal.h.src b/numpy/core/src/npymath/npy_math_internal.h.src
index 18b6d1434..9b0600a34 100644
--- a/numpy/core/src/npymath/npy_math_internal.h.src
+++ b/numpy/core/src/npymath/npy_math_internal.h.src
@@ -55,6 +55,11 @@
  */
 #include "npy_math_private.h"

+double __fmod(double x, double y);
+long double __fmodl(long double x, long double y);
+float __fmodf(float x, float y);
+
+
 /*
  *****************************************************************************
  **                     BASIC MATH FUNCTIONS                                **
@@ -473,8 +478,8 @@ NPY_INPLACE @type@ npy_@kind@@c@(@type@ x)
 /**end repeat1**/

 /**begin repeat1
- * #kind = atan2,hypot,pow,fmod,copysign#
- * #KIND = ATAN2,HYPOT,POW,FMOD,COPYSIGN#
+ * #kind = atan2,hypot,pow,copysign#
+ * #KIND = ATAN2,HYPOT,POW,COPYSIGN#
  */
 #ifdef HAVE_@KIND@@C@
 NPY_INPLACE @type@ npy_@kind@@c@(@type@ x, @type@ y)
@@ -484,6 +489,13 @@ NPY_INPLACE @type@ npy_@kind@@c@(@type@ x, @type@ y)
 #endif
 /**end repeat1**/

+#ifdef HAVE_FMOD@C@
+NPY_INPLACE @type@ npy_fmod@c@(@type@ x, @type@ y)
+{
+    return __fmod@c@(x, y);
+}
+#endif
+
 #ifdef HAVE_MODF@C@
 NPY_INPLACE @type@ npy_modf@c@(@type@ x, @type@ *iptr)
 {

fmod ํ˜ธ์ถœ ํ›„ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ST(0) nan์ด ํฌํ•จ๋˜์ง€ ์•Š๋„๋กํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ข…ํ•ฉ์ ์œผ๋กœ nan์œผ๋กœ ์„ค์ • ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
ํ˜ธ์ถœ ๊ทœ์น™์ด ์ด๋Ÿฌํ•œ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋™์ž‘ ๋ฐฉ์‹์— ์ œ์•ฝ์„ ๊ฐ€ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ucrtbase.dll ์—์„œ ๋น„๋กฏ๋œ fmod ๊ตฌํ˜„์ž„์„ "์ฆ๋ช…"ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ctypes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ dll์—์„œ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  fmod ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ์•ฝ๊ฐ„์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ucrtbase.dll ์˜ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค ( fmod ํ•จ์ˆ˜์—๋งŒ ํ•ด๋‹น). ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. Visual Studio ํฌ๋Ÿผ ์—์„œ

์ตœ์†Œํ•œ ์—ฌ๊ธฐ์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด์žˆ์„ ๊ฒƒ ๊ฐ™์€ azure ๊ณ„์ •์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์ฐฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์ฒ˜์Œ์— ๋‚˜ํƒ€ ๋‚ฌ์„ ๋•Œ Azure ML์—์„œ ์ž‘์—…ํ•˜๋Š” ์—ฐ๋ฝ์ฒ˜ ์ค‘ ์ผ๋ถ€์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ ์—ฌ๊ธฐ์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด์žˆ์„ ๊ฒƒ ๊ฐ™์€ azure ๊ณ„์ •์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์ฐฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

fmod์˜ ์ˆœ์ง„ํ•œ ๋ฒ„์ „์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”. IEEE-754 ์‚ฌ์–‘์—์„œ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊นŒ๋‹ค๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์–‘๊ณผ ๊ด€๋ จ์ด์žˆ๋Š” ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์˜ ๋…ธ๋ ฅ fmod ์— ์˜ํ•ด ์ˆ˜ํ–‰ fprem ์‹ฌ์ง€์–ด VS2019์˜ ๋ณ€ํ˜•์—์„œ, x87 instuction - @mattip ๋ณผ์˜ ์š”์  (๋งˆ์ง€๋ง‰ ์ค„) https://gist.github.com/mattip / d9e1f3f88ce77b9fde6a285d585c738e. ( fprem1 ๋Š” remainder ๋ณ€ํ˜• btw์ž…๋‹ˆ๋‹ค.)

MMX ๋˜๋Š” SSE ๋ ˆ์ง€์Šคํ„ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋Š”์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://stackoverflow.com/questions/48332763/where-does-the-xmm-instruction-divsd-store-the-remainder.

https://github.com/xianyi/OpenBLAS/issues/2709#issuecomment -702634696์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋Œ€์ฒด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ชจ๋“  ๊ฒƒ์€ ์ปดํŒŒ์ผ์„ ์œ„ํ•ด gcc (mingw-w64)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. OpenLIBM์€ MSVC AFAIK๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋Ÿฌ ์ฝ”๋“œ๋Š” MSVC์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ numpy ๋นŒ๋“œ ์ค‘์— fmod ๋„์šฐ๋ฏธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œ (mingw-w64)ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (MSVC).

fmod ํ˜ธ์ถœ ํ›„์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ST (0)์— nan์ด ํฌํ•จ๋˜์ง€ ์•Š๋„๋กํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ข…ํ•ฉ์ ์œผ๋กœ nan์œผ๋กœ ์„ค์ • ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํ˜ธ์ถœ ๊ทœ์น™์ด ์ด๋Ÿฌํ•œ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋™์ž‘ ๋ฐฉ์‹์— ์ œ์•ฝ์„ ๊ฐ€ํ•ฉ๋‹ˆ๊นŒ?

Windows์—์„œ OpenBLAS๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ง€์šฐ๋Š” ์ž‘์€ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ํ…Œ์ŠคํŠธ ์„ค์ •์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‚ด masm ์–ด์…ˆ๋ธ”๋ฆฌ foo๊ฐ€ ์•ฝํ•ฉ๋‹ˆ๋‹ค. fldz ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ ์‹œ์ €๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์‚ฌ์šฉํ•  ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋„์›€?

lots_of_fldz.asm :

.code
lots_of_fldz proc
    fldz
    fldz
    fldz
    fldz
    fldz
    fldz

lots_of_fldz endp
end

๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ :

#include <iostream>
#include <Windows.h>

extern "C" {
int lots_of_fldz(void);
}

int main()
{
    typedef double(*dbldbldbl)(double, double);
    //HMODULE dll = LoadLibraryA("D:\\CPython38\\ucrtbase_old.dll");
    HMODULE dll = LoadLibraryA("c:\\windows\\system32\\ucrtbase.DLL");
    if (dll == NULL) {
        return -1;
    }
    dbldbldbl myfmod;
    myfmod = (dbldbldbl)GetProcAddress(dll, "fmod");
    double x = 0.0, y = 17.0;
    double z = x + y;
    z = myfmod(x, y);
    lots_of_fldz();
    /* CRASH */
    std::cout << "Hello World!\n";
    return 0;
}

VisualStudio ํ”„๋กœ์ ํŠธ์— ๋„ฃ๊ณ ์ด ๊ฐ€์ด๋“œ ์— ๋”ฐ๋ผ masm ์ปดํŒŒ์ผ์„ ์ผญ๋‹ˆ๋‹ค.

@mattip , mingw-w64 (64 ๋น„ํŠธ)์˜ ํ•ด๋‹น fmod ํ•จ์ˆ˜์—์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ text: ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋งŒ๋“œ๋Š” 64 ๋น„ํŠธ fmod ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์–ด์…ˆ๋ธ”๋Ÿฌ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” fmod ํ•จ์ˆ˜๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ์ ์–ด๋„ ํ•˜๋‚˜๋Š” ์‹œ๋„ ํ•ด๋ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ obj ํŒŒ์ผ์€ npymath.lib์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fmod.asm : (64 ๋น„ํŠธ)

.code
fmod PROC
    sub    rsp , 18h
    movsd  QWORD PTR [rsp+8h] , xmm0
    fld    QWORD PTR [rsp+8h]
    movsd  QWORD PTR [rsp+8h] , xmm1
    fld    QWORD PTR [rsp+8h]
    fxch   st(1)
L1:
    fprem
    fstsw  ax
    sahf
    jp     L1
    fstp   st(1)
    fstp   QWORD PTR [rsp+8h]
    movsd  xmm0 , QWORD PTR [rsp+8h]
    add    rsp,18h
    ret
fmod endp
end

masm ๋ช…๋ น : ml64.exe /c fmod.asm fmod.obj (ml64.exe์˜ 64 ๋น„ํŠธ ๋ณ€ํ˜• ์‚ฌ์šฉ)

``

objdump -D fmod.obj
....
Disassembly of section .text$mn:
0000000000000000 <fmod>:
   0:   48 83 ec 18            sub    $0x18,%rsp
   4:   f2 0f 11 44 24 08      movsd  %xmm0,0x8(%rsp)
   a:   dd 44 24 08            fldl   0x8(%rsp)
   e:   f2 0f 11 4c 24 08      movsd  %xmm1,0x8(%rsp)
  14:   dd 44 24 08            fldl   0x8(%rsp)
  18:   d9 c9                  fxch   %st(1)
  1a:   d9 f8                  fprem
  1c:   9b df e0               fstsw  %ax
  1f:   9e                     sahf
  20:   7a f8                  jp     1a <fmod+0x1a>
  22:   dd d9                  fstp   %st(1)
  24:   dd 5c 24 08            fstpl  0x8(%rsp)
  28:   f2 0f 10 44 24 08      movsd  0x8(%rsp),%xmm0
  2e:   48 83 c4 18            add    $0x18,%rsp
  32:   c3                     retq

@carlkl ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. OpenBLAS ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— x86_64์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ST (N) ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ์— ๋” ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์ด ๋ฌธ์ œ๋Š” fmod ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ๋‚ด์ผ์€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜์‹œ ST(N) ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ๋ฐ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด์—†๋Š” ๊ฒฝ์šฐ fmod ๋Š” ์‹ค์ œ๋กœ ๋ฒ„๊ทธ๊ฐ€ ์—†์œผ๋ฉฐ Windows ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด OpenBLAS์—์„œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ๋ฐ ์‹คํŒจํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

์œ„ ์˜ fldz ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mattip , ๋‚ด ์–ด์…ˆ๋ธ”๋Ÿฌ knowlegde๋„ ๋‹ค์†Œ ๊ธฐ๋ณธ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด SO ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ€๋Šฅํ•œ ๋‹ต๋ณ€์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://stackoverflow.com/questions/19892215/free-the-x87-fpu-stack-ia32/33575875

https://docs.microsoft.com/de-de/cpp/build/x64-calling-convention?view=vs-2019์—์„œ :

The x87 register stack is unused. It may be used by the callee, but consider it volatile across function calls.

OpenBLAS nrm2.S (PROFCODE ๋งคํฌ๋กœ ์ดํ›„) ์‹œ์ž‘์‹œ fninit ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์ด๋ก ์„ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—์„œ ํฅ๋ฏธ๋กœ์šด ๋น„ํŠธ
System V ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ธํ„ฐํŽ˜์ด์ŠคAMD64 ์•„ํ‚คํ…์ฒ˜ ํ”„๋กœ์„ธ์„œ ๋ณด์ถฉ ์ž๋ฃŒ์ดˆ์•ˆ ๋ฒ„์ „ 0.99.6

_MXCSR ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ œ์–ด ๋น„ํŠธ๋Š” ์ˆ˜์‹ ์ž ์ €์žฅ (ํ˜ธ์ถœ ๋™์•ˆ ๋ณด์กด ๋จ)์ด๊ณ  ์ƒํƒœ ๋น„ํŠธ๋Š” ํ˜ธ์ถœ์ž ์ €์žฅ (๋ณด์กด๋˜์ง€ ์•Š์Œ)์ž…๋‹ˆ๋‹ค ._

_x87 ์ƒํƒœ ์–ด ๋ ˆ์ง€์Šคํ„ฐ๋Š” ํ˜ธ์ถœ์ž ์ €์žฅ์ด๊ณ  x87 ์ œ์–ด ์–ด๋Š” ํ˜ธ์ถœ์ž ์ €์žฅ์ž…๋‹ˆ๋‹ค ._

_ ๋ชจ๋“  x87 ๋ ˆ์ง€์Šคํ„ฐ๋Š” ํ˜ธ์ถœ์ž ์ €์žฅ๋˜๋ฏ€๋กœ MMX ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”ผ ํ˜ธ์ถœ์ž๋Š” ๋” ๋น ๋ฅธ femms ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ._

Windows 64 ๋น„ํŠธ ํ˜ธ์ถœ ๊ทœ์น™๊ณผ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@ martin-frbg, fninit ๋Š” ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค : The FPU control word is set to 037FH (round to nearest, all exceptions masked, 64-bit precision). X87 ํ™•์žฅ ์ •๋ฐ€๋„๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ, ํŠนํžˆ Windows์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋น ๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์—๋Š” ์ด๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OpenBLAS๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  "์ด์ „์—"์ •๋ฆฌ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ, ๋ ˆ๊ฑฐ์‹œ x87 fpu์— ๋Œ€ํ•œ Windows ๋™์ž‘์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Agner Fog๊ฐ€ http://www.agner.org/optimize/calling_conventions.pdf ์— ํ˜ธ์ถœ ๊ทœ์น™์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค (FP ๋ ˆ์ง€์Šคํ„ฐ์˜ Win64 ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” 13 ํŽ˜์ด์ง€์—์„œ ์‹œ์ž‘ํ•˜์ง€๋งŒ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ ์ „๋ฐ˜์˜ ๊ธฐ๋ณธ ๊ฐ€์šฉ์„ฑ ๋ฐ ๋™์ž‘์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค).

https://github.com/numpy/numpy/issues/16744#issuecomment -703305582๋ฅผ ์ฐธ์กฐ

The x87 register stack is unused. It may be used by the callee, but consider it volatile across function calls.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : x87 ๋ช…๋ น (Win64)์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค. ์ฆ‰, ํ”ผ ํ˜ธ์ถœ์ž๋Š” ํ”ผํ•ด๋ฅผ ์ž…์ง€ ์•Š์„ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ  ๊ทธ๊ฒƒ์€ MSVC ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋™์ž‘์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ mingw ์ƒํƒœ๊ณ„์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, Numpy (Pypi)๋Š” Windows์—์„œ MSVC (Visual Studio 2019)๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. OpenBLAS์˜ ๊ฒฝ์šฐ mingw-w64๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (Fortran ๋ถ€ํ’ˆ์œผ๋กœ ์ธํ•ด). ๋˜ํ•œ Scipy Fortran ๋ถ€๋ถ„์€ mingw-w64๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CPython ๋ฐ ์ด์ง„ ํ™•์žฅ์€ MSVC์—์„œ ์„ค์ • ํ•œ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

BTW : ์ด๊ฒƒ์ด ํ˜„์žฌ ๋‹ค์‹œ ์‚ด์•„ ๋‚˜๊ณ ์žˆ๋Š” https://github.com/mingwpy ๊ฐœ๋ฐœ์˜ ์ด์œ ์˜€์Šต๋‹ˆ๋‹ค. (๋ป”๋ป”ํ•œ ํ”Œ๋Ÿฌ๊ทธ)

๋˜ ๋‹ค๋ฅธ ๋น„ํŠธ :

mingw-w64๋Š” MSVC์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ํ˜ธ์ถœ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ฐจ์ด์ ์€ x86 (32 ๋น„ํŠธ)์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์Šคํƒ ์ •๋ ฌ์ž…๋‹ˆ๋‹ค. SIMD ๋ฐ ์ง€์›๋˜์ง€ ์•Š๋Š” vectorcall ์žˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ ๋กญ๊ตฐ. x86์€ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AMD64 ๋งŒ.

Sun, Oct 4, 2020, 22:19 carlkl [email protected] ์ž‘์„ฑ :

๋˜ ๋‹ค๋ฅธ ๋น„ํŠธ :

mingw-w64๋Š” MSVC์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ํ˜ธ์ถœ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ
์ฃผ๋ชฉํ• ๋งŒํ•œ ์ฐจ์ด์ ์€ x86 (32 ๋น„ํŠธ)์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์Šคํƒ ์ •๋ ฌ์ž…๋‹ˆ๋‹ค.
SIMD ๋ฐ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฒกํ„ฐ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/16744#issuecomment-703317784 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ABKTSRMFHWZVLDYDFGBM6YDSJDRGTANCNFSM4OP5IXNQ
.

MSVC 32bit๋Š” ์•„๋งˆ๋„ fpu๋ฅผ ๋ถ€์ธํ•˜์ง€ ์•Š์•˜์„๊นŒ์š”? fpu-using nrm2.S๋ฅผ nrm2_see2.S (์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ถˆํ–‰ํžˆ๋„ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋–  ๋‹ค๋‹ˆ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์น˜๋ช…์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฃจํ‹ด์ด ๋งŽ์ด ์žˆ์Œ) ๋˜๋Š” OS ์šฉ ์ผ๋ฐ˜ C ๋ฒ„์ „์œผ๋กœ ์ž„์‹œ ์ž„์‹œ ๋Œ€์ฒด๋ฅผ ์ˆ˜ํ–‰ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. == Windows. (์—ฌ๊ธฐ์„œ ๋…ผ์˜ ๋œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” x86_64์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ด์ „ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฃจํ‹ด์ด ์ ์–ด๋„ SSE2๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.)

@mattip, ์–ด์ฉŒ๋ฉด์—๊ฒŒ ์ „ํ™” _fpreset ํ›„ divmod ์—… ์—‰๋ง FPU ์ƒํƒœ์—์„œ ์žฌ์„ค์ •ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค?

_fpreset ๋Œ€ํ•œ ์ „ํ™”

์•„๋‹ˆ์š”, ST(N) ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

_fninit ์‹œ๋„ํ•ด ๋ณด์…จ๋‚˜์š”? ๊ทธ๋Ÿฌ๋ฉด FPU ์Šคํƒ์ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” https://stackoverflow.com/questions/19892215/free-the-x87-fpu-stack-ia32/33575875์— ์–ธ๊ธ‰ ๋œ๋Œ€๋กœ fldz ๋Œ€์‹  ffree ๋˜๋Š” fstp ?

๊ธฐ๊บผ์ด ์–ด์…ˆ๋ธ”๋Ÿฌ ๋ช…๋ น์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์œ„ ์ฃผ์„์˜ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋‚ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์‹ค์ œ๋กœ fninit ๊ฐ€ ์ข‹์€ ํ›„๋ณด ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋ฉด OpenBLAS๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— NumPy์—์„œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ™์€?

.code
reset_fpu proc
    finit
    fldz
reset_fpu endp
end

finit ist wait + fninit . fninit ์ดํ›„์— fldz ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ปดํŒŒ์ผ ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋„๋กํ•˜๊ธฐ ์œ„ํ•ด ๋ˆ„๋ฝ ๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ทธ ์ฝ”๋ฉ˜ํŠธ์—์„œ ๊ฐ€์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ exited with code -2147483645 ์™€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ์ˆ˜์žˆ๋‹ค (๋‚ด์ผ). ๊ทธ๋Ÿฌ๋‚˜์ด ์Šค ๋‹ˆํŽซ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://www.website.masmforum.com/tutorials/fptute/fpuchap4.htm
(๋‚ด๊ฐ€ ์ฐพ์€์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์ฝ๊ธฐ ์‰ฌ์šด ์‚ฌ์ดํŠธ ์ค‘ ํ•˜๋‚˜)

FLDZ (Load the value of Zero)

Syntax:    fldz  (no operand)

Exception flags: Stack Fault, Invalid operation

This instruction decrements the TOP register pointer in the Status Word 
and loads the value of +0.0 into the new TOP data register.

If the ST(7) data register which would become the new ST(0) is not empty, both 
a Stack Fault and an Invalid operation exceptions are detected, setting both flags 
in the Status Word. The TOP register pointer in the Status Word would still 
be decremented and the new value in ST(0) would be the INDEFINITE NAN.

A typical use of this instruction would be to "initialize" a data register intended 
to be used as an accumulator. Even though a value of zero could also be easily 
loaded from memory, this instruction is faster and does not need the use of memory. 

๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋“ฏ์ด st (7)์ด ์‚ฌ์šฉ ์ค‘์ด๋ฉด fldz๊ฐ€ segfault๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FFREE (Free a data register)

Syntax:   free st(x)

This instruction modifies the Tag Word to indicate that the specified 80-bit data register 
is now considered as empty. Any data previously in that register becomes unusable. 
Any attempt to use that data will result in an Invalid exception being detected and an 
INDEFINITE value possibly being generated.

Although any of the 8 data registers can be tagged as free with this instruction, 
the only one which can be of any immediate value is the ST(7) register when 
all registers are in use and another value must be loaded to the FPU. 
If the data in that ST(7) is still valuable, other instructions should be used 
to save it before emptying that register. 

์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.code
reset_fpu proc
    ffree st(7)
    fldz
reset_fpu endp
end

๋ช…ํ™•ํ•˜์ง€ ์•Š์•„์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ๋ฌธ์ œ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ๋ฌธ์ œ๋Š” ์ œ๋Œ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœ ํ”„๋กœ ์‹œ์ €๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๋‘ ํŒŒ์ผ์—์„œ ํ•ด๋‹น (์ฆ๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ *.asm ๋ฐ main.c / main.cpp ) ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์ ํŠธ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฌ๋Ÿฌ ํ˜ธ์ถœ์ด OpenBLAS์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๊ณ„์† ํƒ์ƒ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mattip , ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” UCRT์—์„œ FMOD์˜ _tempory_ ๋‚˜์œ ํ–‰๋™์ด OpenBLAS์— ์˜ํ•ด _healed_ํ•ด์•ผ ์ธ์ƒ์„ ๊ฐ€์ง€๊ณ  : https://github.com/xianyi/OpenBLAS/pull/2882์„ ํ•˜์ง€ WIN64์—์„œ FPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” NumPy์™€ ๊ฐ™์€ NumPy์™€์— ์˜ํ•ด. ๋ฌผ๋ก  MS๋Š” Windows ํŒจ์น˜๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ numpy ํŒจ์น˜๋Š” ๋นŒ๋“œ ์ค‘์— ๋‹ค๊ฐ€์˜ค๋Š” OpenBLAS ๋ฆด๋ฆฌ์Šค๋ณด๋‹ค ์˜ค๋ž˜๋˜์ง€ ์•Š์€ OpenBLAS ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@matti numpy/__init__.py ์˜จ ์ „์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

a = np.arange(13 * 13, dtype=np.float64).reshape(13, 13)
a = a % 17
va, ve = np.linalg.eig(a)

@mattip , ์Šค ๋‹ˆํŽซ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐ์Šคํฌํ†ฑ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ์„ค์น˜ํ•  ์ˆ˜์—†๋Š” ์ตœ์†Œํ•œ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ๋žฉํ†ฑ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

OpenBLAS v0.3.12์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณ‘ํ•ฉํ–ˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฒ„์ „ + Windows ์—…๋ฐ์ดํŠธ 2004๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ ๋นŒ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

Windows๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๊นŒ์ง€ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค.

์ถœ์‹œ ์ „ ํœ ์ด ์ƒˆ๋กœ์šด OpenBLAS๋กœ ์ œ์ž‘ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Windows 3.9 ์‹œํ—˜ํŒ ํœ ์ด ํ˜„์žฌ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (ํ˜„์žฌ ์ˆ˜์ • ๋จ). ๊ณ ์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์˜ค๋Š˜ ๋˜๋Š” ๋‚ด์ผ ๋‚˜์˜ฌ 1.19.3์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

/MT ์˜ต์…˜์€ Windows์—์„œ ์ •์  ๋งํฌ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. 1909 ๋ฒ„์ „์˜ Microsoft SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ libucrt.lib์— ๋Œ€ํ•ด ์ •์ ์œผ๋กœ ๋งํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 2004 ๋…„๊ณผ 20H2์˜ ucrtbase.dll ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”ํ€ด๋ฅผ ๋” ํฌ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

์ด / MT ๋ฌธ์ œ ๊ฐ€ ์—ฌ์ „ํžˆ ์œ ํšจํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

NumPy๊ฐ€ MT๋กœ ๋นŒ๋“œ๋˜๋Š” ์œ ์ผํ•œ ๋ชจ๋“ˆ์ด๋ผ๋ฉด
ํ™•์ธ. ๋ฌผ๋ก  NumPy๊ฐ€ MT์ด๋ฉด
๋‹ค์šด ์ŠคํŠธ๋ฆผ๋„ MT ์—ฌ์•ผํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

2020 ๋…„ 11 ์›” 2 ์ผ ์›”์š”์ผ 19:37 carlkl [email protected] ์ž‘์„ฑ :

์ด / MT ๋ฌธ์ œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”
https://stevedower.id.au/blog/building-for-python-3-5-part-two ๋Š” ์—ฌ์ „ํžˆ
์œ ํšจํ•˜์ง€๋งŒ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/16744#issuecomment-720682011 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ABKTSRJIVAQLECK4E2EVSSDSN4C65ANCNFSM4OP5IXNQ
.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ถŒ์žฅ๋˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ์ƒํ™ฉ์€ ๋‚ด๊ฐ€ 2004 ์—…๋ฐ์ดํŠธ๋กœ ์—…๋ฐ์ดํŠธ ๋œ ์ปดํ“จํ„ฐ์— ์žˆ๊ณ  pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ numpy / scipy / pandas ๋“ฑ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ์Šคํฌํ†ฑ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋Š” Microsoft ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•œ์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„๋ฐ›์Šต๋‹ˆ๋‹ค.

conda๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ numpy๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ž‘์—…์ค‘์ธ ์†Œํ”„ํŠธ์›จ์–ด์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋„ ์ปค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 1.19.3์„ ๊ณ ์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด Windows ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ. 1.19.3์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด pip์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ BLAS ๊ฐ์ง€์˜ ๋งํฌ๋Š” MS ์‚ฌ์ดํŠธ์— ๋งŽ์€ ์‹œ๋„๋Ÿฌ์šด ๊ฒŒ์‹œ๋ฌผ์„ ์œ ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฒฐ๊ตญ ํญ๋ฐœํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ Win64์—์„œ ํƒ€์‚ฌ fmod๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NumPy๊ฐ€ ์ถœ์‹œ ํ›„ 4 ๊ฐœ์›” ๋™์•ˆ ์ด๋ ‡๊ฒŒ ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํŠนํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜์žˆ๋Š” ๋ช…ํ™•ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‘๋‹ต์ด ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” 1.19.3์— ์‰ฝ๊ฒŒ ๊ณ ์ • ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์—‰๋ง์ด ๋œ ํ›„ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ๋งŒ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด : ucrt์— FPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์–‘ํ˜ธํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๊ฐ€ ์žˆ๋‹ค๋ฉด fmod ๋‹ค์Œ์— ์ด๊ฒƒ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ˆ˜ ํŒŒ์ผ์ด๋‚˜ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— @mattip์ด ์ž‘์„ฑํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ถ”๊ฐ€ ์ž‘์—…์€ ๊ท€์ค‘ํ•œ ๊ฐœ๋ฐœ์ž ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  Microsoft๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด fmod ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋Š” NumPy์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„์ด ๋ฌธ์ œ์— ๋ถ€๋”ช ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ถ”๊ฐ€ ์ž‘์—…์€ ๊ท€์ค‘ํ•œ ๊ฐœ๋ฐœ์ž ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  Microsoft๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด fmod ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋Š” NumPy์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„์ด ๋ฌธ์ œ์— ๋ถ€๋”ช ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ๋ฐ˜์‘์„ ๋ณด์•˜์„ ๋•Œ ๊ทธ๋‹ค์ง€ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ตœ์‹  NumPy ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” Windows ์‚ฌ์šฉ์ž๋Š” ํ• ํœ ์ด ์•„๋‹Œ MKL๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ฐฐํฌํŒ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋งํฌ๋„ ํฌํ•จ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ MS์˜ ์ฑ…์ž„์ด์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ž˜๋ชป์„ ์ง€์ ํ•˜๋„๋ก ๊ณ ํ†ต์„์ฃผ๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ ์˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

@bashtage ๊ณ ํ†ต์„ ์œ ๋ฐœํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๊ธฐ์— ์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, 2004 ๋…„์— ์‹คํ–‰๋  ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ”Œ๋žซํผ์—์„œ ๊ณ„์‚ฐ์„ ํ”ผํ•ด์•ผ ํ•จ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ†ต์ฆ์„ ์œ ๋ฐœํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

NumPy ๊ฐ€์ ธ ์˜ค๊ธฐ๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ์‹คํŒจํ•˜๋ฉฐ ์ œ๊ณต๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ชฉ๋ก์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

(a) conda ๋˜๋Š” Enthought Deployment Manager์™€ ๊ฐ™์€ MKL ๊ธฐ๋ฐ˜ ๋ฐฐํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜์ง€๋งŒ ์„ ํ˜• ๋Œ€์ˆ˜ ์ฝ”๋“œ์—์„œ
(b) ๋ฒ„๊ทธ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋˜๋Š” OpenBLAS ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” NumPy 1.19.3์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰์ค‘์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(c) ์†Œ์Šค์—์„œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ์„ฑ๋Šฅ์ด ๋‚ฎ์€ BLAS๋ฅผ ๊ฐ–์ง€๋งŒ ํƒ€์‚ฌ ๋ฐฐํฌ๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ NumPy์˜ ์ตœ์‹  ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ์— ์ ํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” fmod ๋ฒ„๊ทธ์— ๋Œ€ํ•ด์ฃผ์˜๋ฅผ ํ™˜๊ธฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ž˜๋ชป์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ๋งˆ์น˜ ํ•ด๊ฒฐ์ฑ…์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๋ฅผ ํ•ด๋‹น ํฌ๋Ÿผ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋งํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๊ธฐ์— ์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, 2004 ๋…„์— ์‹คํ–‰๋  ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ”Œ๋žซํผ์—์„œ ๊ณ„์‚ฐ์„ ํ”ผํ•ด์•ผ ํ•จ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” NumPy + OpenBLAS (์˜ˆ : 0.3.12) ๋งŒ ํ”ผํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. NumPy + Windows (2004 / 20H2 (ํ˜„์žฌ 2 ๊ฐœ์˜ ๋ฆด๋ฆฌ์Šค ๋œ ๋ฒ„์ „์ด ์˜ํ–ฅ์„ ๋ฐ›์Œ))๋ฅผ ํ”ผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

MKL ๊ธฐ๋ฐ˜ ๋ฐฐํฌ

MKL์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š”๋ณด๊ณ ๋„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

NumPy 1.19.3์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ

๊ทธ๋Ÿฌ๋‚˜ fmod ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ๋‹ค๋ฅธ ์ž ์žฌ์  ์ธ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ 2004 ๋…„์— Python์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ๋Œ€์‹  WSL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์œˆ๋„์šฐ ํœ ์ด์žˆ๋Š” ์˜ค๋ž˜๋œ ucrt๋ฅผ ํฌํ•จํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€ ๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด์ „ Windows ๋ฒ„์ „์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

MKL์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š”๋ณด๊ณ ๋„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

NumPy์—๋Š” MKL์—์„œ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ  ๋œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. fmod ๋ฒ„๊ทธ๋Š” MKL์˜ BLAS์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์•„๋งˆ FPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—).

๊ทธ๋Ÿฌ๋‚˜ fmod ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ๋‹ค๋ฅธ ์ž ์žฌ์  ์ธ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”.ํ•˜์ง€๋งŒ Windows ๋ณด์•ˆ ๋ฌธ์ œ ๋‚˜ ๋‹ค๋ฅธ ๋งŽ์€ ๋ฒ„๊ทธ๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ๋งค์šฐ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

  1. fmod๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์—์„œ ์ข‹์Šต๋‹ˆ๋‹ค.
  2. ์‹œ์Šคํ…œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ x87 ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ ค๋ฉด ์–ด์…ˆ๋ธ”๋Ÿฌ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋„๋‹ฌํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜์—๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. OpenBLAS, ์†์œผ๋กœ ์ž‘์„ฑํ•œ ์ปค๋„์„ ํฌํ•จํ•˜๋Š” FFT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” MKL๊ณผ ๊ฐ™์€ ์ตœ๊ณ  ์„ฑ๋Šฅ ์ฝ”๋“œ ๋งŒ # 2๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

OpenBLAS 0.3.12๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ–ˆ๋‹ค๋ฉด NumPy๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์„ ๊ฒƒ์ด๊ณ ์ด ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ธฐ๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์„ ์ถœ์‹œํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ 2004 ๋…„์— Python์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ๋Œ€์‹  WSL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์œˆ๋„์šฐ ํœ ์ด์žˆ๋Š” ์˜ค๋ž˜๋œ ucrt๋ฅผ ํฌํ•จํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€ ๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด์ „ Windows ๋ฒ„์ „์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋งŽ์€ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ด๊ฒƒ์€ ๊ธฐ์—… ๋ฐ์Šคํฌํ†ฑ์˜ ๊ธฐ์—… ์‚ฌ์šฉ์ž, ์ดˆ๋ณด ํ•™์ƒ (์ฝ˜ ๋‹ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”), ๋˜๋Š” ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜์—†๋Š” 2004 ๋˜๋Š” 20H2 ๋…ธํŠธ๋ถ์„ ๊ตฌ์ž… ํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์ œ๋กœ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Condas numpy๋Š” MLK์— ๋งํฌ๋˜์–ด์žˆ์„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์ „ ๋ฒ„์ „ (10.0.17134.12) ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์ž์ฒด ๋ฒ„์ „ ์ธ ucrtbase.dll ๋„ ์ด๋ฏธ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ @bashtage์— ํฌ๊ฒŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ๋ฆฌ์ ์ธ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด์—†๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ ์‹คํŒจ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฝ๊ฐ„ ์ ๋Œ€์ ์ž…๋‹ˆ๋‹ค (Microsoft์— ๋Œ€ํ•œ ์ฃผ์š” ๊ฒฐํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

@jenshnielsen : Condas numpy๊ฐ€ MLK์— ๋Œ€ํ•ด ๋งํฌ๋˜์–ด์žˆ์„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ [...]

conda-forge์— ์˜ํ•ด ํŒจํ‚ค์ง• ๋œ ๋นŒ๋“œ๋Š” blas / lapack ๊ตฌํ˜„ (openblas / mkl / blis / netlib์—์„œ)์„ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์ง€๋งŒ MKL์ด _have_๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ 2004 ๋…„์— Python์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ๋Œ€์‹  WSL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธฐ๋ณธ ์ž‘๋™ ๋ชจ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์œˆ๋„์šฐ ํœ ์ด์žˆ๋Š” ์˜ค๋ž˜๋œ ucrt๋ฅผ ํฌํ•จํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€ ๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์šฐ๋ฆฌ์˜ ์ฑ…์ž„์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด์ „ Windows ๋ฒ„์ „์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒˆ๋กœ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ •๋ฆฌํ–ˆ๋‹ค๋ฉด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ ํ•ด์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ @bashtage์— ํฌ๊ฒŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ๋ฆฌ์ ์ธ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด์—†๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ ์‹คํŒจ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฝ๊ฐ„ ์ ๋Œ€์ ์ž…๋‹ˆ๋‹ค (Microsoft์— ๋Œ€ํ•œ ์ฃผ์š” ๊ฒฐํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉด ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์œˆ๋„์šฐ ํœ ์ด์žˆ๋Š” ์˜ค๋ž˜๋œ ucrt๋ฅผ ํฌํ•จํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€ ๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@charris , Windows 10์—์„œ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. python ๋˜๋Š” numpy์™€ ํ•จ๊ป˜ ๋‹ค๋ฅธ ucrt๋ฅผ ๋ฐฐํฌํ•˜๋ฉด Windows 10์—์„œ๋กœ๋“œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .์ด ๋ฐฉ๋ฒ•์€ ์ด์ „ Windows ๋ฒ„์ „ (Windows 7, 8, 8.1)์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ—‰
conda-packaged python์€ ์‹ค์ œ๋กœ DLL ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ํ™•์ธ์— ๊ฐœ์ž… ํ•ฉ๋‹ˆ๋‹ค (๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ-์•„๋งˆ๋„ Windows 10์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ์ด์œ  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ AFAICT๊ฐ€ conda _does_๊ฐ€ ucrtbase.dll ์ œ๊ณตํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค @jenshnielsen์ด ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ucrtbase.dll .

@ h-vetinari, Universal CRT ๋ฐฐํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

_ ๋กœ์ปฌ ๋ฐฐํฌ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
Windows 10์—์„œ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋ฒ”์šฉ CRT์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ ์‹œ์Šคํ…œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ฒ”์šฉ CRT๊ฐ€ ํ•ญ์ƒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Universal CRT๋Š” Windows 10์˜ ํ•ต์‹ฌ ์šด์˜ ์ฒด์ œ ๊ตฌ์„ฑ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์ด ๋” ์ตœ์‹  ์ธ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค ._

BTW : ์ง์ ‘ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. Windows 10๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌ ๋œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UCRT ์ด์™ธ์˜ ๋‹ค๋ฅธ UCRT๋ฅผ๋กœ๋“œ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ฆด๋ฆฌ์Šคํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ PR gh-17547์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

@carlkl ์˜ ์š”์  ์ฆ๋ช… :

image

MS ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•˜๋Š”์ด ๋ฒ„๊ทธ๋Š” Heisenbug ๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. Windows 2004 UCRT fmod๋Š” ํŠน์ • ์ƒํ™ฉ์—์„œ FPU ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ž˜๋ชป๋œ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‚˜์ค‘์— FPU๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ๋•Œ ์ˆ˜์น˜ ๊ณ„์‚ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ„์‚ฐ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๋‹นํ•œ ์ˆ˜์น˜ ์˜ค๋ฅ˜๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๊ฐ์ง€๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์Œ์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ PR gh-17547์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž˜๋ชป ์ผ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ์œ ์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ NumPy๊ฐ€ ๊ฐ€์ ธ ์˜ค๊ธฐ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์— ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—… / ํ•™๊ต / ์ทจ๋ฏธ๋ฅผ ๊ณ„์†ํ•  ์ˆ˜์žˆ๋Š” Windows 2004 / H2 ํ™˜๊ฒฝ์„ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. WSL
  2. conda / enthought
  3. 1.19.3
  4. ์†Œ์Šค์—์„œ ๋นŒ๋“œ

[์ด ์ˆœ์„œ๋Š” ์†”๋ฃจ์…˜์˜ ํ’ˆ์งˆ์— ๋Œ€ํ•œ ์„ ํ˜ธ๋„์ž…๋‹ˆ๋‹ค.]

์ด ๋ฌธ์ œ ๋˜๋Š” ๋” ๊นŠ์€ ์„ค๋ช…์„ ์ œ๊ณตํ•˜๋Š” ์ข€ ๋” ๋ช…ํ™•ํ•œ ๋ฌธ์ œ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๋ฒˆ์งธ ๋งํฌ๋Š” github ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๋ฌธ์„œ์˜ ์ผ๋ถ€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์— ๋Œ€ํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

conda-forge์— ์˜ํ•ด ํŒจํ‚ค์ง• ๋œ ๋นŒ๋“œ๋Š” blas / lapack ๊ตฌํ˜„ (openblas / mkl / blis / netlib์—์„œ)์„ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์ง€๋งŒ MKL์ด _have_๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@ h-vetinari conda-forge + OpenBLAS๋Š” 2004 / H2์— ํ†ต๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ ํ™•์ธํ•˜๊ณ  Coda-forge์—์„œ OpenBlas 0.3.12๋ฅผ ๋ฐฐ์†กํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๊นŒ?

OpenBLAS-0.3.12์—์„œ EMMS ๋ช…๋ น๊ณผ ํ•จ๊ป˜ FPU ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹น์—ฐํžˆ numpy ๋ฐ scipy ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ @charris๊ฐ€ fmod(0,x) CPython ๋ฐ ๋‚˜์ค‘์— ํ˜ธ์ถœ๋˜๋Š” FPU ๋ช…๋ น (OpenBLAS์™€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€)๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๋งŒ ์ด๋™๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์‹ค์ œ๋กœ MS๊ฐ€ ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๋™์ž‘์„ ํŒจ์น˜ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Steve Dower๊ฐ€ ๋„์™€ ์ค„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ด๊ฒƒ์€ Agner Fog ๋˜๋Š” Bruce Dawson์—๊ฒŒ๋„ ํฅ๋ฏธ๋กœ์šด ์ด์•ผ๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ๋ธ”๋กœ๊ทธ์—์„œ์ด ๊ด€๋ จ ์ด์•ผ๊ธฐ๋ฅผ๋ณด์‹ญ์‹œ์˜ค.
์˜ค๋ž˜๋œ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์‹œ ์ƒˆ๋กญ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ

์•„๋งˆ๋„ OpenBlas 0.3.12์˜ ๋ฒ„๊ทธ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Private Bytes ์—ด์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

image

๋…ผ๋ฆฌ์  CPU๊ฐ€ 24 ๊ฐœ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์€ BLAS ์Šค๋ ˆ๋“œ 24 ๊ฐœ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ conda-forge์˜ NumPy 1.19.2๊ฐ€์žˆ๋Š” OpenBLAS 0.3.12์ž…๋‹ˆ๋‹ค.

$env:OPENBLAS_NUM_THREADS=1 ํ•˜๋ฉด ๋Œ€ํญ ๊ฐ์†Œ

image

$env:OPENBLAS_NUM_THREADS=4 ์Šค๋ ˆ๋“œ :

image

@bashtage : OpenBLAS xianyi / OpenBLAS # 2970์—์„œ OpenBLAS 0.3.12์— ๋Œ€ํ•ด ๊ณ„์† ๋…ผ์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mattip conda + OpenBLAS๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์•ˆ์ธ์ง€ ํ™•์ธํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 1.19.3์ด ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์•˜์„ ๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@bashtage : @carlkl ์˜ ์š”์  ์ฆ๋ช… :

conda-packaged python์€ Windows ํ‘œ์ค€ DLL ํ•ด์ƒ๋„๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์šฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— Windows ๋„๊ตฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฆ๊ฑฐ๊ฐ€ ๋ ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C:\Windows\System32 ์˜ค๋ž˜๋œ libcrypto.dll ์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜์‹ญ์‹œ์˜ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๊ตฌ์‹ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” cryptography ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ์— ์˜ํ•ด์„œ๋งŒ ์„ ํƒ๋˜์—ˆ์œผ๋ฉฐ, CONDA_DLL_SEARCH_MODIFICATION_ENABLE ์‚ฌ์šฉํ•˜๋ฉด conda๊ฐ€ ์ œ๊ณตํ•˜๋Š” openssl์„ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bashtage : @ h-vetinari conda-forge + OpenBLAS๋Š” 2004 / H2์— ํ†ต๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๊นŒ?

ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” CI๋Š” ์•„๋งˆ๋„ ํ˜„์žฌ ๋ฒ„์ „์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง์ ‘ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ 2004 ๋…„ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ์ด๊ฒƒ์€ ๋งค์šฐ ๊ธ์ •์  ์ธ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค ** :

= 10487 passed, 492 skipped, 19 xfailed, 1 xpassed, 227 warnings in 529.08s (0:08:49) =

@bashtage : ๋ฐฉ๊ธˆ ํ™•์ธํ•˜๊ณ  conda-forge์—์„œ OpenBlas 0.3.12๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๊นŒ?

conda-forge๋Š” ๊ณ ์ • ๋œ openblas ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. blas ๋ฒ„์ „์€ "hotswap"(์˜ˆ : openblas, mkl, blis ์‚ฌ์ด) ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„์ „์ด ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์‹  ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์žฌํ˜„๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@bashtage :: @mattip conda + OpenBLAS๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์•ˆ์ธ์ง€ ํ™•์ธํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 1.19.3์ด ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์•˜์„ ๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋Š” xianyi / OpenBLAS # 2970์—์„œ ์ž์„ธํžˆ ๋…ผ์˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ openblas 0.3.12์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ conda-forge๋Š” ์ €์—๊ฒŒ ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์•ˆ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์˜ค๋ฅ˜์˜ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„๋ฐ›์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

** ๋‚˜๋Š” ํ˜„์žฌ์˜ ๋งˆ์Šคํ„ฐ https://github.com/conda-forge/numpy-feedstock ์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹1.19.2์— ์žˆ๊ณ  openblas 0.3.12์™€ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด https://github.com/conda-forge/numpy-feedstock/pull/210 + openblas 0.3.12๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์œผ๋กœ MS๋Š” VS ํฌ๋Ÿผ์— ๋‹ค์‹œ ๋Œ์•„์™€ 2021 ๋…„ 1 ์›” ๋ง๊นŒ์ง€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ์—…๋ฐ์ดํŠธ๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์œ ์ผํ•œ ์งˆ๋ฌธ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

conda-packaged python์€ Windows ํ‘œ์ค€ DLL ํ•ด์ƒ๋„๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์šฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— Windows ๋„๊ตฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฆ๊ฑฐ๊ฐ€ ๋ ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ตฌ์‹์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค libcrypto.dll ์—์„œ C:\Windows\System32 ์ฐธ์กฐ ์˜ˆ๋ฅผ ๋“ค์–ด CONDA - ๋‹จ์กฐ๋Š” / # 11452๋ฅผ ๊ฐœ์ตœ-์š”๋ฆฌ๋ฒ• . ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๊ตฌ์‹ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” cryptography ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ์— ์˜ํ•ด์„œ๋งŒ ์„ ํƒ๋˜์—ˆ์œผ๋ฉฐ, CONDA_DLL_SEARCH_MODIFICATION_ENABLE ์‚ฌ์šฉํ•˜๋ฉด conda๊ฐ€ ์ œ๊ณตํ•˜๋Š” openssl์„ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

conda create -n cf -c conda-forge python numpy pytest hypothesis blas=*=openblas openblas=0.3.9 -y
conda activate cf
python -c "import numpy as np;np.test('full')"

์ถœ๋ ฅ

C:\Anaconda\envs\cf\lib\site-packages\numpy\linalg\linalg.py:94: LinAlgError
---------------------------------------------------------------------- Captured stdout call ----------------------------------------------------------------------
 ** On entry to DGEBAL parameter number  3 had an illegal value
 ** On entry to DGEHRD parameter number  2 had an illegal value
 ** On entry to DORGHR DORGQR parameter number  2 had an illegal value
 ** On entry to DHSEQR parameter number  4 had an illegal value

์ด๊ฒƒ์€ ์ด์ „ OpenBLAS๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ํ˜„์žฌ ucrt DLL์˜ ๋ฒ„๊ทธ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

conda forge์˜ openblas = 0.3.12 ๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ NumPy 1.19.3์—์„œ ์ถœ์‹œ ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์žฅ ํ•ด์ œ ๋œ OpenBLAS-0.3.12๋กœ ์ปดํŒŒ์ผ ๋œ ์ƒˆ๋กœ์šด numpy ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? numpy์— ์‚ฌ์šฉ๋˜๋Š” OpenBLAS์˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์Šค๋ ˆ๋“œ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” OpenBLAS์˜ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ์ค„์—ฌ์•ผํ•˜๋ฉฐ Docker ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์žฅ๋น„๊ฐ€ ๋ถ€์กฑํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฐฝ ์ƒ์ž.

์—ฌ๊ธฐ Python ๋‚ด๋ถ€์˜ https://tinyurl.com/y3dm3h86 ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์—์„œ. ๋จผ์ € ํ˜„์žฌ Windows์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฒ„์ „ (1.19.3)์„ ์ œ๊ณตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1.19.3์€ Linux์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  1.19.4๋Š” Windows์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๋™์•ˆ).

Windows์˜ ๊ฒฝ์šฐ pypi 1.19.3์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ 1.19.4์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰, https://files.pythonhosted.org/packages/33/26/c448c5203823d744b7e71b81c2b6dcbcd4bff972897ce989b437ee836b2b/numpy-1.19.4-cp36-cp36m-win_amd64.whl (๋ฐ ํ•ด๋‹น 3.7 / 3.8 / 3.9 amd64 ๋ฒ„์ „)์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€?

@luciansmith ์†Œ์Šค๊ฐ€ 1.19.4์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•œ pip๋Š” ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ํ•œ์ด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ๋ฌธ์ œ๋ฅผ ์•Œ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ 1.19.3์„ ๊ณ ์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์„ ํ˜ธ๋Š” Linux์—์„œ OpenBLAS 0.3.9๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Windows์—์„œ 0.3.12๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 1.19.5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰