最近、Numexpr のバグと思われるものを発見しました。私はすでに彼らの Git ハブでイシューをオープンしましたが、ここでも集団の知恵を利用できると考えました。
簡単に言えば、evaluate
単純な配列操作を実行すると、(予期せずに) 正しくない結果が返されることがあります。以下の Python コードで再現できるバグは、正しい結果ではなくゼロの配列が返されます。サンプル コードは乗算を示していますが、このバグは加算と累乗にも現れています。特に、Numexpr によって発生するエラーや警告はなく、計算負荷は正常に見え (つまり、タスク マネージャーを監視するときに RAM と CPU に予想どおりに負荷がかかります)、正しい形状配列が返されます。これらの理由から、分離するのはかなり陰湿なバグでした! テストでは、このバグは次のハードウェア ビルドでのみ発生しました。
- Windows Server 2012 r2、Intel Xeon 2680 v3、2 プロセッサ、48 個の論理コア
- Windows 8.1、Intel Xeon 2690、1 プロセッサ、24 個の論理コア
Windows 7、64 ビット、Intel i7 マシンで完了したソフトウェアの何千回もの実行のすべてにおいて、これが明らかになったことはありません。さらに、添付のコードを何度も (より大きな配列とより多くの反復を使用して) 実行しましたが、Windows 7、i7 マシンでエラーは発生していません。ただし、Xeon コンピューターは定期的にそれを明らかにします。残念ながら、他にテストできるビルドはありません。
その他の注意事項:
- WinPython ディストリビューション 3.4.3.6 から実行しています。
- サポートする Numexpr 関数を呼び出していない
evaluate
ため、デフォルト設定を使用しています。 - Numexpr のバージョンは 2.4.4 で、WinPython 3.4.3.6 に含まれています。
サンプルコード:
import numpy as np
import numexpr as ne
x = np.ones(1e6)
y = np.ones(1e6)
for ii in range(1000):
rr = ne.evaluate('x * y')
test = np.all(rr == 0)
if test:
print('Gotcha! %d' % ii)
print('Complete!')