などの ILMath 関数を使用するILMath.linspace
と、明らかな理由もなく次の例外がスローされることがあります。
System.TypeInitializationException was unhandled by user code
HResult=-2146233036
Message=The type initializer for 'ILNumerics.Misc.ILThreadPool' threw an exception.
Source=ILNumerics
TypeName=ILNumerics.Misc.ILThreadPool
StackTrace:
at ILNumerics.Misc.ILThreadPool.Wait4Workers(Int32& workerCount)
at ILNumerics.ILMath.multiplyElem(ILInArray`1 A, ILInArray`1 B)
at ILNumerics.ILDenseArray`1.op_Multiply(ILDenseArray`1 A, ILDenseArray`1 B)
at ILNumerics.ILMath.linspace[T](ILBaseArray start, ILBaseArray end, ILBaseArray length)
at ILNumerics.ILMath.linspace(ILBaseArray start, ILBaseArray end, ILBaseArray length)
at *** in ***\Numerics\NumericsTest.cs:line 104
at *** in ***\Numerics\NumericsTest.cs:line 94
InnerException: System.ComponentModel.Win32Exception
HResult=-2147467259
Message=The parameter is incorrect
Source=System
ErrorCode=-2147467259
NativeErrorCode=87
StackTrace:
at System.Diagnostics.ProcessThread.set_ProcessorAffinity(IntPtr value)
at ILNumerics.Misc.ILThreadPool..ctor(Int32 maxThreads)
at ILNumerics.Misc.ILThreadPool..cctor()
InnerException:
試行錯誤の結果、 を設定するILNumerics.Settings.UseThreadAffinity = false
と、コードがエラーなしで実行されることがわかりました。デフォルトで false に設定する必要がある ILNumerics のドキュメントを読みましUseThreadAffinity
たが、私の場合はデフォルトで確実に true に設定されています。これはバグですか?ドキュメントには、App.configを使用してデフォルト設定を変更できることも記載されていることに気付いた別の問題があります。それを試してみましたが、ILNIsHosted
実際にはそのとおりに動作しILNUseThreadAffinity
ますが、設定にはまったく影響しませんUseThreadAffinity
。falseに設定しようとしても、まだ「true」です。これは ILNumerics のバグですか? NuGet から直接取得した ILNumerics 3.2.2.0 (任意の CPU) を使用しています。コードは、Windows 7 64 ビットの VS2010 で実行されています。
<appSettings>
<add key="ILNIsHosted" value="true" />
<add key="ILNUseThreadAffinity" value="false"/>
</appSettings>
元の質問に追加するために、ILNumerics コミュニティ エディションのソース コードをダウンロードしに行ったところ、奇妙なことがわかりました。
ILSettings.cs には、次のものが含まれています。
public static bool UseThreadAffinity {
get { return s_isHosted; }
set { s_isHosted = value; }
}
これらの行は私には意味がありません。UseThreadAffinity が s_isHosted に設定されているのはなぜですか。これが、ILNIsHosted を true に設定すると、スレッド アフィニティも true に変更された理由であると考えられます。