4

有没有人使用过英特尔数学内核库 http://software.intel.com/en-us/intel-mkl/

我正在考虑将其用于C# 应用程序的随机数生成,因为我们需要极高的性能(每天 1.6 万亿个随机数)。

还有任何关于在我的 c# Monte Carlo 模拟中最小化使用此 c++ 代码中的函数开销的建议。

  • 我即将从网站及以上下载 Eval 并尝试从我的 c# 应用程序中对其进行基准测试,非常感谢任何帮助。

谢谢

4

7 回答 7

1

我使用 MKL 和英特尔编译器开发了一个蒙特卡洛/随机软件。通常,您必须将随机数生成包装在 c++ dll 中。这是最简单的,因为您可以控制名称修改和调用约定。至于最小化开销,解决这个问题的最佳方法是将模拟代码完全保留在 C++ 中,无论如何它都可能属于它,并且只有调用 C# 层才能获得更新。最小化互操作损失的唯一方法是减少调用,我发现其他建议(/unsafe 等)从性能角度来看是无用的。您可以在我的项目存储库 - Stochfit中看到此类程序的交互和结构示例。

于 2009-07-27T16:22:11.410 回答
1

我对这个图书馆知之甚少。但如果它是真正的 C++ 代码,那么您将无法直接从 C# 调用它。C# 只能通过以下三种方式之一与 C++ 交互

  1. PInvoke 进入 C++ 库之上的 C 包装器
  2. COM 互操作
  3. 反向 PInvoke(仍然需要上面的 1 或 2 来插入 wrapper func)

如果是大型 C++ 代码库,最好创建一个精简的 C++/CLI 包装器来与库进行交互。然后从 C# 调用它。

于 2009-07-27T16:03:06.580 回答
0

英特尔有一组示例演示从 C# http://software.intel.com/en-us/articles/using-intel-mkl-in-your-c-program调用 MKL

于 2009-10-30T19:38:51.087 回答
0

对您来说可能或可能不明显的事情:跨托管和非托管代码边界的调用很慢,因此如果您走这条路线,您可能希望大批量检索随机数块以分摊调用时间。

于 2009-07-27T18:51:33.637 回答
0

将函数调用声明为“静态”(尽管我不确定这会产生什么不同),并确保您的基准测试将 DLL 调用与内置的 C# Random 类进行比较。我不确定英特尔代码会快得多,但谁知道呢?

于 2009-07-27T16:04:47.047 回答
0

1) 链接显示“它包括与 Microsoft Visual Studio 的改进集成”

2) 有评估版

因此,为什么不试试呢?很可能英特尔已经提供了必要的绑定。或不。至少你不会把钱浪费在无用的软件上。

于 2009-07-27T16:46:56.197 回答
0

这是 C# 中的高质量高效随机数生成器。这段代码调用 C++ 会更有效。即使您的 C++ 代码在零时间内运行,您仍然需要从托管代码移动到非托管编码再返回的开销。

于 2009-07-27T18:30:00.653 回答