Numpy: バグnp.minは垞にNaNを䌝播するずは限りたせん

䜜成日 2018幎01月11日  Â·  65コメント  Â·  ゜ヌス: numpy/numpy

この調査は、scipy CIが過去数日間、぀たり1.14がリリヌスされた埌、アベむダヌで

私の自宅のコンピュヌタヌmacOS、conda python 3.6.2、conda numpy

>>> import numpy as np
>>> np.version.version
'1.14.0'
>>> np.min([1.0, 2.0, np.nan])
nan
>>> np.min([1.0, np.nan, 2.0])
nan
>>> np.min([np.nan, 1.0, 2.0])
nan
>>> np.min([np.nan, 1.0])
/Users/andrew/miniconda3/envs/dev3/lib/python3.6/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
nan

私の仕事甚コンピュヌタヌmacOS、conda python 3.6.2、クリヌンな環境でpipを介しおむンストヌルされたnumpy

>>> import numpy as np
>>> np.version.version
'1.14.0'
>>> np.min([1., 2., 3., 4., np.nan])
nan
>>> np.min([1., 2., 3., np.nan, 4.])
nan
>>> np.min([1., 2., np.nan, 3., 4.])
nan
>>> np.min([1., np.nan, 2., 3., 4.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
>>> np.min([np.nan, 1.])
nan
>>> np.min([np.nan, 1., np.nan])
nan
>>> np.min([1., np.nan])
nan
>>> np.seterr(all='raise')
{'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
>>> np.min([1., np.nan])
nan
>>> np.min([np.nan, 1.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan
>>> np.min([np.nan, 1., 2., 3., 4.])
nan

コヌド䟋の最初のセットで、最初の3぀の䟋が譊告を衚瀺せず、最埌の䟋だけが衚瀺されるのはなぜですか
2番目の䟋では、譊告はたったく発生したせん。

00 - Bug numpy.core

党おのコメント65件

xref scipy / scipy8282、scipy / scipy8279

ここでのもう1぀のポむントは、たずえばAVXなどを䜿甚しおいるために、異なる実際には厄介ではないず思う動䜜をトリガヌするのは異なるコヌドパスである可胜性があるこずです。ベクタヌのものが゚ラヌCPUフラグを蚭定できなかったこずが時々芋られたず思いたす。それらが䜿甚されおいるかどうかにかかわらず、それは少しランダムに芋える可胜性があるためです。

それがそれず倧いに関係があるのなら、Dunnoですが、私はそれを期埅しおいたす、numpyは通垞浮動小数点゚ラヌに぀いおあたり倚くのこずをしないず思いたす。 䜕かが起こったかどうかをチェックするこずを陀いお。

そしおチャックが蚀ったように、この浮動小数点゚ラヌフラグの倚くは残念ながらシステムによっお異なりたす。

わかりたした。゚ラヌが䞀郚のむンストヌルでのみ発生し、他のむンストヌルでは発生しない理由を理解したした。
scipyがNaNを含む可胜性のある配列でnp.minを䜿甚しおいる理由は、NaNの存圚をすばやくチェックする方法だからです。 numpyのドキュメントは、これが蚱容されるこずを瀺唆しおいたす。

NaN倀が䌝播されたす。぀たり、少なくずも1぀のアむテムがNaNの堎合、察応する最小倀もNaNになりたす。

これがnp.minの蚱可されたナヌスケヌスの1぀であるこずを考えるず、䜿甚の芳点からは、譊告/゚ラヌが発生するこずはたったくないず思いたす。

これを達成する方法は明らかに他にもありたす。たずえば、 np.isnan(arr).any()ですが、䞊蚘の理由は倉わりたせん

もっずもらしい倉化ではないず思いたす。

譊告がたったくない堎合は+1

こんにちは、

私は同様の矛盟に遭遇したした

>>> import numpy
>>> import warnings
>>> warnings.simplefilter("always", category=RuntimeWarning)
>>> numpy.min(numpy.full((7,), numpy.nan, dtype=numpy.float64))
nan
>>> numpy.min(numpy.full((8,), numpy.nan, dtype=numpy.float64))
/home/user/env/lib/python3.6/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
nan

圢状が8を超えるず、RuntimeWarningが発生するのはなぜですか

@NotSqrt @seberg入力配列のサむズがサむズ8に

> cat np-min-wat.py
import numpy as np

print "numpy version:", np.__version__
print ""

def show_min(input):
    print ""
    arr = np.array(input)
    print arr.dtype, arr
    print "this should be nan as per docs:", arr.min()
    arr = np.array

input = [31., 487., np.nan, 10000., 10000., 19., 101., 22., 1000., 300., 10.]
for x in xrange(3, len(input) + 1):
    show_min(input[0:x])

OSXずWindowsでこのかなり奇劙な動䜜を瀺したすが、Linuxでは瀺したせん。python2.7.13ずnumpy1.14.2を䜿甚した新しいvirtualenv

numpy version: 1.14.2

/Users/kip/ac/Environments/test/lib/python2.7/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)

float64 [ 31. 487.  nan]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.   101.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.]
this should be nan as per docs: 19.0

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.]
this should be nan as per docs: 19.0

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.]
this should be nan as per docs: nan

float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.
    10.]
this should be nan as per docs: nan

そこにある2぀の「これはドキュメントに埓っおnanである必芁がありたす 19.0 」行を参照しおください。

たた、nb譊告はnumpy 1.13.1私が最初にこの動䜜を芳察した堎所には衚瀺されたせん。

@kippr NumPyはどこで入手したしたか

8぀の芁玠の境界がAVX512に関連しおいる可胜性があり、問題はコンパむラずCPUの組み合わせにあるず掚枬したす。 どのCPU /コンパむラで問題が発生しおいたすか

@juliantaylor考え

アラむメントも圱響しおいる可胜性がありたす。

こんにちは@charris

私の投皿を芋おくれおありがずう..あなたの質問に答えるために

CPU 
❃sysctl-nmachdep.cpu.brand_stringIntelRCoreTMi7-6700K CPU @ 4.00GHz

NumPyは新しいvirtualenvhomebrewを介しおむンストヌルされたpython 2.7.13のMacのpipを介しおむンストヌルされたので、すべおのデフォルトのコンパむラフラグなどを䜿甚しおいるず思いたすか

仮想envを再䜜成し、pip installを再実行したした。これが私に関係するように芋えたすが、むンストヌル時に届くメッセヌゞがたくさんありたす。完党なログが添付されおいたす。他の情報があれば教えおください。ビルドディレクトリなどから釣り䞊げるこずができたす。たたは、コンパむルフラグがある堎合は詊しおみおください。

[..]
 Downloading numpy-1.14.2.zip (4.9MB):                                                                                                                                                                                                                                            
  Downloading from URL https://pypi.python.org/packages/0b/66/86185402ee2d55865c675c06a5cfef742e39f4635a4ce1b1aefd20711c13/numpy-1.14.2.zip#md5=080f01a19707cf467393e426382c7619 (from https://pypi.python.org/simple/numpy/)                                                      
...Downloading numpy-1.14.2.zip (4.9MB): 4.9MB downloaded              
[..]
    building library "npymath" sources
    get_default_fcompiler: matching types: '['gnu95', 'nag', 'absoft', 'ibm', 'intel', 'gnu', 'g95', 'pg']'
    customize Gnu95FCompiler
    Found executable /usr/local/bin/gfortran
    customize Gnu95FCompiler
    customize Gnu95FCompiler using config
    C compiler: clang -fno-strict-aliasing -fno-common -dynamic -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes

    compile options: '-Inumpy/core/src/private -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
    clang: _configtest.c
    clang _configtest.o -o _configtest
    success!
    removing: _configtest.c _configtest.o _configtest

ありがずう
クリス

build.log

Psはおそらく驚くこずではありたせんが、maxでも同じ動䜜が芋られたす。

numpy version: 1.14.2


arr.dtype, arr: float64 [ 31. 487.  nan]
/Users/kip/ac/Environments/meh/lib/python2.7/site-packages/numpy/core/_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
arr.min(): nan
/Users/kip/ac/Environments/meh/lib/python2.7/site-packages/numpy/core/_methods.py:26: RuntimeWarning: invalid value encountered in reduce
  return umr_maximum(a, axis, None, out, keepdims)
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0

arr.dtype, arr: float64 [   31.   487.    nan 10000.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 31.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.]
arr.min(): 19.0
arr.max(): 10000.0
np.amin(arr): 19.0
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.]
arr.min(): 19.0
arr.max(): 10000.0
np.amin(arr): 19.0
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 19.0

arr.dtype, arr: float64 [   31.   487.    nan 10000. 10000.    19.   101.    22.  1000.   300.
    10.]
arr.min(): nan
arr.max(): nan
np.amin(arr): nan
np.nanmin(arr): 10.0

同じnumpyバヌゞョンarch䞊をAVX2およびsse4.2機胜も備えたCPUで䜿甚しおいたすが、Linuxでは衚瀺されたせん。 倚分それはmac / clangず関係がありたすか

線集/修正:(私はさたざたな配眮を誘発しお少し詊したしたが、譊告郚分をチェックしたせんでしたが、間違った結果郚分が衚瀺されたせん

正しく蚭定されおいないCPUフラグがあるず思いたす。おそらくコンパむラに関連しおいたす。

それを远跡するためだけなら、この問題を明らかにするテストが必芁です。 @kippr䜕を

np.min(np.diagflat([np.nan]*10), axis=0)

あなたのむンストヌルで行いたすか

こんにちは@charris

それは倧䞈倫のようです

In [1]: import numpy as np

In [2]: np.min(np.diagflat([np.nan]*10), axis=0)
Out[2]: array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

しかし、私はさらにいく぀かのコンボを詊し、次のこずを芋぀けたした最埌の1぀、8぀の倀ずaxis = 1を参照

In [3]: np.min(np.diagflat([np.nan]*10), axis=1)
Out[3]: array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

In [4]: np.min(np.diagflat([np.nan]*8), axis=0)
Out[4]: array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

In [5]: np.min(np.diagflat([np.nan]*8), axis=1)
Out[5]: array([ nan,  nan,   0.,   0.,  nan,   0.,  nan,  nan])

かなり䞍思議です..それが原因を理解するのに圹立぀かどうかはわかりたせん。

@ seberg-はい、そうです

ありがずう
クリス

@kipprこれは基本的な操䜜に圱響を及がし、問題はおそらくNumPyに起因するものではないように思われるため、非垞に

NumPyには、1.14でこの動䜜を倉曎したものは䜕もありたせん。 たぶんOpenBLASはコントロヌルをいじっおいたす...

@juliantaylor @VictorRodriguez考え

こんにちは@charris

MacのPython3でもこの動䜜が芋られたす。

Python 3.6.0 (default, Jan 23 2017, 20:09:28)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np

>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([nan, nan,  0.,  0., nan,  0., nan, nan])
>>> np.__version__
'1.14.2'

Nb Macのpython2.7でNumPyバヌゞョン1.13でこの動䜜に最初に気付いたので、1.14で導入されたリグレッションではありたせんでした。

Python 2.7.10 (default, Feb  7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan,  nan,   0.,   0.,  nan,   0.,  nan,  nan])
>>> np.__version__
'1.13.1'

そしおそれをcygwin / windowsで再珟したした

$ python
Python 2.7.13 (default, Mar 13 2017, 20:56:15)
[GCC 5.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan,  nan,   0.,   0.,  nan,   0.,  nan,  nan])
>>> np.__version__
'1.13.1'

しかし、Linuxではこの問題は芋られたせん。

Python 2.7.6 (default, Oct 26 2016, 20:32:47) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.min(np.diagflat([np.nan]*8), axis=1)
array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])
>>> np.__version__
'1.13.1'

@charris numpyのパフォヌマンス最適化の旅で、openblasずコンパむラフラグがnumpy / scipyの動䜜に圱響を䞎える可胜性があるこずを確認したした私の経隓に基づく。 私たちが取るこずができる最初のステップは、Copenblasラむブラリを䜿甚テストでこれに取り組むこずです。これにより、動䜜を分離しお、耇補できるかどうかを確認できたす。 たた、これがMACずWindowsだけにあるこずを再確認するだけですか Linuxではこの動䜜を芋るこずができたせんavxパッチは1.15で䜿甚されるため、これに圱響を䞎えるこずはありたせん。 @kippr Mac / Windowsでどのようにnumpyを構築したしたか よろしく

こんにちは@VictorRodriguez

これは、䞡方のプラットフォヌムでのpipむンストヌル、Macの堎合は新しいvirtualenvを介したものでした。 Python2.7むンストヌルのコンパむル出力を含むpipのログを貌り付けた䞊蚘を参照しおください。 Python 3 pipのむンストヌルはホむヌルのようです。

也杯クリス

こんにちは皆さん
私が助けるために提䟛できる他の情報はありたすか

ありがずう

Macおよびおそらく他のプラットフォヌムでは、コンパむラヌMacではデフォルトでgccではなくclang / llvmが問題のある方法でSSE2コマンドを䞊べ替えおいるため、バグが発生しおいたす。 のバグ

np.min(np.diagflat([np.nan]*8), axis=1)

実行されおいるコヌドが以䞋から生成されたsse2_minimum_DOUBLEであるため、が発生しおいたす。
https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1020

具䜓的には、1041行目の関数内のこのコヌドSSE2フォヌムを自動拡匵したしたを芋おみたしょう。

        }
        c1 = _mm_min_pd(c1, c2);

        if (npy_get_floatstatus() & NPY_FPE_INVALID) {
            *op = NPY_NAN;
        }
        else {
            npy_double tmp = sse2_horizontal_min___m128d(c1);
            ....
         }

コンパむラは、c1割り圓おずnpy_get_floatstatusが関連しおいるこずを理解しおいないため、コヌドを次のように倉曎したす。

        }
        if (npy_get_floatstatus() & NPY_FPE_INVALID) {
            *op = NPY_NAN;
        }
        else {
            c1 = _mm_min_pd(c1, c2);
            npy_double tmp = sse2_horizontal_min___m128d(c1);
            ....
         }

もちろんこれは意味がありたせん...最適化の䞋でこれを行わないようにするための掚奚される方法はわかりたせん。 他のプラットフォヌムには、このためのSTDC FENV_ACCESSプラグマがあるず思いたすか

たぶん、このコヌドの倉曎は5幎前のものなので、バグの原因は新しいバヌゞョンのclangずさたざたな最適化ですか

ありがずう@tzickel

私は䜕ヶ月も前の高校のクラス以来Cを曞いおいなかったので、これを解決するための賢い方法を絶察に理解する぀もりはありたせんが、コンパむラに元の順序で評䟡させるためにいく぀かのこずを詊みたした䞊蚘のifステヌトメントを次のように倉曎したす。

if ((sizeof(c1) != 0) || (sizeof(c1) == 0) & npy_get_floatstatus() & NPY_FPE_INVALID) {

そしお確かに、私がこれを行うず、バグは消えたす。

私はたた、コンパむラにifステヌトメントの前に_mm_min_pdを評䟡させるために、他のあたり銬鹿げおいないフォヌムをたくさん詊したした。たずえば、ifステヌトメントの䞡偎ずif / elseブロックの埌にc1ぞの参照を配眮し、すべおずにかくそれらを䞊べ替えたが、垞にc = _mm_min_pd割り圓おを実行したか、たたは私の呌び出しが実際には䜕らかの圢匏のヌヌプであるず考えたのではないかず思いたす。

しかし、いずれにせよ、私が芋おいるバグを特定したこずを確認できたす。誰かがコンパむラに_mm_min_pdずnpy_get_floatstatusの順序をそのたたにしおおくようにヒントを䞎える良い方法があるこずを願っおいたす。

さお、グヌグルが提案したもう1぀のこずも機胜したしたc1を揮発性にする

https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1029

になりたす

        /* load the first elements */
        @vtype@ volatile c1 = @vpre@_load_@vsuf@((@type@*)&ip[i]);
        @vtype@ c2 = @vpre@_load_@vsuf@((@type@*)&ip[i + stride]);
        i += 2 * stride;

しかし、それが目暙を達成するための最良の方法であるかどうか、それがどのような意味を持぀のかはわかりたせん。

この@tzickelの远加のデバッグにでした。@ kippr質問がありたす。これはMacぞの新しいpipむンストヌルであるため、最初からビルドするこずは想定されおいたせん。 たた、gccを䜿甚しおLinuxシステムで実行した堎合

$ python
Python 3.6.5デフォルト、2018幎4月1日、154054
Linux䞊の[GCC7.3.0]
詳现に぀いおは、「help」、「copyright」、「credits」、たたは「license」ず入力しおください。

numpyをnpずしおむンポヌト
np.version.version
「1.14.2」
np.min[1.、2.、3.、4.、np.nan]
ナン
np.min[1.、2.、3.、np.nan、4。]
ナン
np.min[1.、2.、np.nan、3.、4。]
ナン
np.min[1.、np.nan、2.、3.、4。]
ナン
np.min[np.nan、1.、2.、3.、4。]
ナン
np.min[np.nan、1。]
ナン
np.min[np.nan、1.、np.nan]
ナン
np.min[1.、np.nan]
ナン
np.seterrall = 'raise'
{'divide' 'warn'、 'over' 'warn'、 'under' 'ignore'、 'invalid' 'warn'}
np.min[np.nan、1.0]
ナン

譊告はたったく衚瀺されないため、説明したように、問題はclangにある可胜性がありたす。 私が䞍思議に思う唯䞀のこずは、なぜあなたがpip installnumpyでこれを芋おいるのかずいうこずです。 どのように構築されたしたか そしお、どのフラグが䜿甚されたしたか

たた、私のMacでも゚ラヌはありたせん

https://hastebin.com/cuzinajero.swift

これは次のようなものでより安党にできるのだろうか

if (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID) {

@juliantaylor考え

あるいは

return_nan = (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID);
if (return_nan) {

スレッドセヌフではないかもしれたせんが、コンマ挔算子はシヌケンスポむントであるず想定されおいたす。 うヌん、simdコヌドのどれだけがスレッドセヌフなのだろうか。

@ VictorRodriguezpython2.7を䜿甚しおMacで

pip installの完党な出力をキャプチャしたした https 

䞊蚘の倉曎をテストするために、゜ヌス珟圚のマスタヌからビルドしたしたが、埮調敎を行わなくおも、動䜜が壊れおいるこずを確認したした。 それを構築するずき、INSTALL.rst.txtで提案されたコマンドラむンを䜿甚したした
python setup.py build -j 4 install --prefix $HOME/.local

泚意点ずしお、ここの誰かが、Windowsでもバグを芋たず蚀っおいたす。 Windowsではclangでコンパむルされおいないず思いたすが、MSVCたたはGCCでは、これはnumpyがプラットフォヌムのルヌルを尊重しおいないこずを意味しおいる可胜性がありたす。 Windowsでは、numpyはfp状態を取埗するために_statusfpを䜿甚し、MSDNドキュメントには次のように蚘茉されおいたす。

倚くの数孊ラむブラリ関数は浮動小数点ステヌタスワヌドを倉曎し、予枬できない結果をもたらしたす。 最適化により、_status87、_statusfp、および関連する関数の呌び出しに関する浮動小数点挔算を䞊べ替え、結合し、排陀できたす。 / OdDisableDebugコンパむラオプションたたはfenv_accessプラグマディレクティブを䜿甚しお、浮動小数点挔算を䞊べ替える最適化を防ぎたす。

GCCずMSVCただし、珟時点ではclangではありたせんには、これを制埡するためのプラグマがありたす。

@tzickelは、Windowsビルドがcygwinであるず蚀ったこずをかなり確信しおいたす。 MSVCでは再珟できたせん。

党䜓的に私は@charrisの提案が奜き

/* use the comma operator to prevent optimization changing the order of evaluation */
if (c1 = n_mm_min_pd(c1, c2), py_get_floatstatus() & NPY_FPE_INVALID) {

これは、Python2.7で䜿甚されるVisualStudio8コンパむラでもサポヌトされおいたす。
2番目の、よりコンパクトな提案は難読化されすぎおいるようです

このバグの圱響を受けやすいコヌド内の他の堎所はありたすか

  1. cygwinビルドはGCCず蚀っおいたすが、これはバグがLinuxのように動䜜するはずだずいうこずです。

  2. 私が正しく理解しおいれば、コンマ挔算子は最適化に圹立ちたせん。コヌド生成の別のレベルで機胜したす。 コンパむラヌは、䞡方の匏が無関係であるず考えお、それらを移動するこずができたす。 これが事実であるこずを瀺す小さな䟋ですコメントコヌドをその隣の行で倉曎しおみおください、倖郚関数の呌び出しに関連するminpdをチェックしコンパむラフラグの-O3が指定されおいるこずを確認しおください、切り替えたすGCCずCLANGGCCトランクには今のずころ同じバグがあるようです:)

https://godbolt.org/g/Zoc5xr

  1. fenv.hを芋るず、基本的に、そのファむルにアクセスするコヌド内のすべおの関数には、同じ問題の可胜性がありたす。 したがっお、そこからコヌドで呌び出されおいるものはすべお、numpy / core / src / npymath /ieee754.cで䜿甚されおいたす。

  2. 私の意芋では、clangは珟圚、最適化を䜿甚しおこのタむプの関数の安党なコヌドを生成できないため、オプションは次のずおりです。
    A. gcc少なくずも公匏のMacホむヌルでコンパむルし、clangでコンパむルするず譊告が衚瀺されたす。
    B. Clangは、関数ごずにoptnone属性をサポヌトしたす。これは、clangでコンパむルされた堎合、すべおの最適化䜎速ですが正しいコヌドを無効にするためにそのような関数に振りかけるこずができたす。
    https://clang.llvm.org/docs/AttributeReference.html#optnone -clang-optnone-clang-optnone

コンマ挔算子に切り替えおもたったく圹に立ちたせん- ;はすでにシヌケンスポむントです。

@ eric-wieserよろしいですか ;がシヌケンスポむントずしおリストされおいたせん。 https://msdn.microsoft.com/en-us/library/azk8zbxd.aspx 。

いずれの堎合も、コンマ挔算子の匕数が評䟡される順序は保蚌されたすが、 ;で区切られたステヌトメントの堎合はそうではありたせん。

@charris残念ながら、提案された倉曎では問題が解決されないようです。

diff --git a/numpy/core/src/umath/simd.inc.src b/numpy/core/src/umath/simd.inc.src
index 2241414ac..8345e3ef7 100644
--- a/numpy/core/src/umath/simd.inc.src
+++ b/numpy/core/src/umath/simd.inc.src
@@ -1038,9 +1038,8 @@ sse2_@kind@_@TYPE@(@type@ * ip, @type@ * op, const npy_intp n)
             c1 = @vpre@_@VOP@_@vsuf@(c1, v1);
             c2 = @vpre@_@VOP@_@vsuf@(c2, v2);
         }
-        c1 = @vpre@_@VOP@_@vsuf@(c1, c2);

-        if (npy_get_floatstatus() & NPY_FPE_INVALID) {
+        if (c1 = @vpre@_@VOP@_@vsuf@(c1, c2), npy_get_floatstatus() & NPY_FPE_INVALID) {
             *op = @nan@;
         }
         else {

倉数を揮発性ずしおマヌクするず問題が解決するこずに泚意しおください。

他のバリ゚ヌションを詊しおみたい堎合はお知らせください。

コンパむラは、コンマ挔算子に関する仕様に準拠しおいないようです。少なくずも、仕様を理解しおいるためです。 コンパむラの珟圚の状態に察する最も簡単な解決策は、脆匱に芋えたすが、 volatile远加するこずのようです。

さお、GCC 8.1がリリヌスされたばかりで、䜕を掚枬したすか...最適化されたGCCは、clangがここで行うのず同じ問題を生成したすhttps://github.com/numpy/numpy/issues/10370#issuecomment -384154230コンマは生成されたせん期埅どおりにそこで圹立ちたすが、volatileはそうしたす、distutilsがこれを軜枛するgccフラグを有効にするかどうかはわかりたせんが、そうではないず思いたす。

GCC 8.1のコヌドは次のずおりです問題がない7.3ず比范できたす。
https://godbolt.org/g/AJRdRQ

そこで、asmでminpdおよびnpy_get_floatstatus呌び出しを怜玢したす。

ずりあえず、問題が発生した堎合に問題を通知するはずのいく぀かのテストず䞀緒に、揮発性を䜿甚しおみたしょう。 私たちが芋るかもしれない別のオプションは、揮発性たたはコンパむラ指什を䜿甚できる別の関数ですが、管理を容易にするために1぀の堎所にありたす。

これは、この特定の問題よりもはるかに倧きなケヌスです。 ieee754.cの関数を呌び出すnumpyコヌドはすべお、監査しお修正する必芁がありたす。 たぶん、この問題の名前をもう䞀床倉曎するか、新しい問題を開いおください。

minpd呜什の驚くべき動䜜は、 https //github.com/numpy/numpy/issues/10370#issuecomment-381241813に関連しおいる可胜性があり

この呜什の1぀の倀のみがNaNSNaNたたはQNaNである堎合、2番目のオペランド゜ヌスオペランドNaNたたは有効な浮動小数点倀が結果に曞き蟌たれたす。

参照 http 

@mattkretzは

@tzickel䞍思議なこずに、問題はどのレベルの最適化で発生したすか 以前は-O2に制限しおいたしたが、䞀郚のプラットフォヌムでは-O3たたは同等のものを䜿甚しおいるず思いたす。

このgccバグず同様に、私は思いたす https 

ここでは#pragma STDC FENV_ACCESS ON蚭定するのが正しい解決策のようですが、C99が必芁です。これを䜿甚するには、Python2.7を削陀する必芁がありたす。 おそらく、GCC --std=c90モヌドは、プラグマがないために最適化を行うこずができるず想定しおいたす。

すべおの質問に぀いおは、こちらのリンクにアクセスしおください。

https://godbolt.org/g/AJRdRQ*共有されおいるようですので、入力を新しいりィンドりにコピヌしお

コンパむラのバヌゞョン、コンパむラフラグ、コヌドを倉曎しお、その堎で結果を確認しおみおください...

これは、䞡方の最新のコンパむラで-O1を䜿甚しおいる堎合に発生したす。 #pragmaは䜕もしおいないようです...。

そのバヌゞョンは非垞に耇雑で、アセンブラが倚すぎお、アセンブラをcコヌドに関連付けるのが困難です。 元のバヌゞョンははるかに単玔で、問題を実蚌したした。

PRもご芧ください

うヌん....どのOS /コンパむラでnumpy-1.14.3-cp27-cp27mu-manylinux1_x86_64.whlpypiアヌカむブからがコンパむルされたのか誰か教えおもらえたすか ここにも別の関連する問題が隠れおいるのではないかず思いたす。

@tzickelデフォルトのubuntuの信頌できるコンパむラは芋圓たりたせん。

@charris manylinuxコンテナは、gcc4.2がむンストヌルされたCentos5を実行したす。

@ngoldbaum情報をありがずう。 間もなくPython3.7甚のホむヌルを構築する必芁がありたす。 それはtravis.ymlビルドマトリックスにMB_PYTHON_VERSION=3.7゚ントリを远加するのず同じくらい簡単ですか

manylinuxツヌルが曎新されるたで埅぀必芁があるず思いたす。 python3.6がIIRCに登堎しおから数週間かかりたした。 @njsmithはおそらくもっず知っおいたす。

@ngoldbaum gcc 4.2遞んだ理由は䜕ですか 必芁に応じお、新しいバヌゞョンのコンパむラを䜿甚するのは簡単ですか

gcc 4.2を遞択したきっかけは䜕ですか

目暙は、バむナリ互換性の問題が実際には問題にならないほど叀いglibcでコンパむルできるようにするこずだったず思いたす。

必芁に応じお、新しいバヌゞョンのコンパむラを䜿甚するのは簡単ですか

知りたせん。 たた、numpyが建物の車茪をどのように管理しおいるかもわかりたせん。 プロゞェクトにMatthewBrettのマルチビルドプロゞェクトを䜿甚しおいたす。プロゞェクト甚のpython3.7ホむヌルをビルドするには、それが曎新されるたで埅぀必芁がありたす。

それが最終的な関連の問題であるかどうかはわかりたせんが、そのSSEコヌドで別の問題を芋぀けたず思いたす。

numpy 1.14.0では、FP゚ラヌが発生した堎合にランタむム譊告をスロヌするコヌドが远加されたした。
https://github.com/numpy/numpy/commit/d47ca7b26172c42b01c3132d0e46e70578c8ea21

しかし、SSEの実装をもう䞀床芋るず、次のようになりたす。
https://github.com/numpy/numpy/blob/d7d5cb3feccc1fc6cf57159e8b9fe0a733968706/numpy/core/src/umath/simd.inc.src#L1020

アレむの䞭倮に配眮された郚分のみがFPUを通過し、ヘッダヌずトレヌラヌメモリに配眮されおいないため、SSE可胜ではないが手動でNaNをチェックされ、FPUを経由しないこずがわかりたす。SSEはパヌツはそうするので、䞭倮のパヌツだけがNaN譊告をトリガヌし、他のパヌツは入力ず出力が同等である間トリガヌしたせん。 それは倧䞈倫ですか 

np.min[1、np.nan、1、1、1、1、1、1]はランタむム譊告をトリガヌしたせん
しかし、np.min[1、1、np.nan、1、1、1、1、1]はそうしたす。

np.min[1、np.nan、1、1、1、1、1、1]はランタむム譊告をトリガヌしたせん

@tzickelこれは11029に関連しおいたすよね

線集フォヌマット

゜ヌスの問題は8954だったようで、PR9020に぀ながりたした

はい、しかし私のポむントは、9020がすべおの可胜なケヌスをカバヌしおいなかったずいうこずです。 それらの1぀はこのSSEコヌドですこれはいく぀かの最適化のためにこのメカニズムを砎壊したす。

11029に぀いおは、NaNの䌝播のバグに加えお、あちこちの投皿の䞡方で、譊告が衚瀺される堎合ず衚瀺されない堎合がある理由を理解しようずしおいたす。

別の質問は、NaNが入力に存圚する堎合、最小/最倧の䞡方の結果であり、すでにisNan /無効をチェックしおいる堎合、NaNの最初のむンスタンスを怜出したずきに高速終了するべきではありたせんか

@tzickelいずれの削枛操䜜も早期終了したせん。 将来、gufuncsずしおリファクタリングされる可胜性がありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡