1

などの 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 に変更された理由であると考えられます。

4

0 に答える 0