2

我们正计划为 windows 开发一个数据挖掘包。程序核心/计算引擎将在 F# 中开发,GUI 内容/DB 绑定等在 C# 和 F# 中完成。

但是,我们还没有决定模型的实现。由于我们需要高性能,我们可能不能在这里使用托管代码(这里有什么反对意见吗?)。问题是,在 FORTRAN 中开发模型是否合理,或者我们应该坚持使用 C(或者可能是 C++)。我们正在考虑在某个时候将 OpenCL 用于合适的模型 - 对于这些情况,必须从托管代码 -> FORTRAN -> C -> OpenCL 调用开始感觉很有趣。

有什么建议吗?

4

2 回答 2

4

F# 编译为具有即时编译器的 CLR。它是 ML 的一种方言,它是强类型的,允许所有与该类型架构相关的不错的优化;这意味着您可能会从 F# 获得合理的性能。为了比较,您还可以尝试将您的代码移植到 OCaml(IIRC 编译为本机代码),看看这是否会产生重大影响。

如果它真的太慢了​​,那么看看扩展硬件能让你走多远。通过现代 PC 或服务器提供的性能,除非您使用真正的 brobdinagian数据集,否则您似乎不太可能需要去任何异国情调的东西。数据集较小的用户在普通 PC 上可能没问题。

工作站为您提供的容量可能比标准桌面 PC 多一个数量级。像 HP Z800XW9400 (其他几家制造商提供类似套件)这样的高端工作站可以采用两个 4 或 6 核 CPU 芯片、数十 GB 的 RAM(在某些情况下高达 192 GB),并具有多种用于高- 高速 I/O,如 SAS 磁盘、外部磁盘阵列SSD。 这种类型的硬件很昂贵,但可能比大量的程序员时间便宜。您现有的桌面支持基础架构应该能够使用这种工具包。最可能的问题是在 64 位操作系统上运行 32 位软件的兼容性问题。在这种情况下,您可以使用各种选项(例如 VM 或 KVM 切换器)来解决兼容性问题。

下一步是 4 或 8 插槽服务器。相当普通的 wintel 服务器最多可以使用 8 个插槽(32-48 个内核),可能还有 512GB 的 RAM - 无需离开 Wintel 平台。这为您提供了在您选择的平台内相当广泛的选择,然后您必须去任何异国情调的1

最后,如果您不能使其在 F# 中快速运行,请验证 F# 原型并使用 F# 原型作为控件构建 C 实现。如果这还不够快,你就有问题了。

如果您的应用程序可以以适合平台的方式构建,那么您可以查看一个更奇特的平台。根据您的应用程序的工作情况,您可以将其托管在集群、云提供商上,或者在GPU、 Cell 处理器FPGA 上构建核心引擎。 但是,在这样做时,您会产生(相当可观的)额外成本和可能导致支持问题的外来依赖项。您可能还必须带一位知道如何对平台进行编程的第三方顾问。

毕竟,最好的建议是:吸吮它,看看。如果您对 F# 感到满意,您应该能够相当快地制作应用程序原型。看看它的运行速度有多快,不要太担心性能,直到你有一些明确的迹象表明它确实会成为一个问题。请记住,Knuth 说过,过早的优化在大约 97% 的情况下是万恶之源。如果您认为性能确实会造成麻烦,请留意天气问题并重新评估您的策略。

编辑:如果你想制作一个打包的应用程序,那么你可能会对性能更加敏感。在这种情况下,性能可能会比定制系统更早成为问题。但是,这并不影响基本的“试一试”原则。


  1. 例如,冒着开始流行词宾果游戏的风险,如果您的应用程序可以并行化并在无共享架构上运行,您可能会看到是否可以诱导其中一个云服务器提供商 [ducks] 托管它。可以构建适当的前端以在本地或通过浏览器运行。

    然而,在这种类型的架构上,与数据源的互联网连接成为瓶颈。如果您有大型数据集,那么将这些数据上传到服务提供商就会成为问题。在本地处理大型数据集可能比通过 Internet 连接上传更快。
于 2009-10-19T08:29:07.297 回答
3

我建议不要打扰优化。首先尝试获得一个工作原型,然后找出计算时间花在哪里。您可以在需要时将最大的瓶颈移到 C 或 Fortran 中——然后看看它有多大的不同。

正如他们所说,通常 90% 的计算花费在 10% 的代码中。

于 2009-10-19T07:48:11.683 回答