java - 哪种语言/框架适用于 HPC : Java/.Net/Delphi/C/C++/Objective-C?

标签 java .net c++ objective-c c

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




我无休止地考虑了哪种语言/框架最适合以下内容。我需要开发一个高性能计算框架。所有处理都将完全面向对象。它将在实例之间(外部)和内部线程和引擎之间传递对象。对象将是 Active Messages 的扩展.

这些实例可以在移动设备、Windows、Mac、Linux 等上运行。

系统需要能够快速高效地执行高度并行计算,理想地利用 SSE,理想地支持 CUDA/OpenCL。

我考虑了以下几点:

Java - 它需要内存并且不能在 Mac 上运行(无论如何都不是正式的)
.Net - 内存饥渴;平台范围受限;没有本地上证所
Delphi - 不是 64 位;有限的平台范围
C/C++ - Mac 不直接支持;代码复杂;然而它无处不在
Objective-C - Mac 支持;似乎在其他地方得到支持;通过传递消息来工作,这符合我的设计要求;不太了解

有什么建议?

最佳答案

这是我对一些选项的总结(排名不分先后):

C/C++

如果您只关心性能(和 没有 其他),这些将提供。直接访问系统级构造,例如处理器关联和内联汇编,肯定会对性能产生影响。但是,C/C++ 选项有两个主要缺点。首先,两者都没有明确定义的内存模型,因此您正在开发的内存模型是您正在运行系统的 CPU 的内存模型(如果您不知道内存模型是如何应用于并发编程的,那么您应该不做)。这将您与单一平台紧密联系在一起。第二个是缺少垃圾收集器,在简单的情况下手动内存管理很棘手(但可行),C++ 有许多支持实用程序可以简化问题(例如自动指针/智能指针)。在编写并发代码时,它要困难一个数量级,因为应该释放某块内存的规则变得非常难以定义。例如。当一个对象被传递到另一个线程时,谁负责释放它?如果使用 C++,请务必确保您使用的是用于帮助管理内存的类的线程安全版本。例如。 boost 智能指针仅支持在不同线程中使用声明为“const”的方法(例如取消引用是可以的),但是非常量方法(例如赋值)不是线程安全的。

java

Java 是我的推荐,它支持您提到的所有平台(包括移动设备,例如 JavaME 和 Android)以及 CUDA support . Java 有一个明确定义的跨平台一致的内存模型,一个健壮和成熟的 JIT 和优化器,以及许多优秀和改进的垃圾收集器。大多数用 Java 编写的通用应用程序的运行速度与其对应的 C/C++ 应用程序一样快。虽然它有点占用内存,但如果你在做 HPC 工作,你很可能会在这个问题上投入一些不错的硬件。鉴于您可以在商用硬件上处理 100 GB 的内存,内存问题不像以前那么严重了。移动是唯一一个内存使用受限的真实领域,专业运行时环境在这方面表现更好(见上文)。 Java 的唯一主要缺点(从 HPC 的角度来看)是缺少通过复制复杂类型(即 C# 中的结构),因此所有复杂对象都必须在堆上分配,从而给 GC 带来压力。逃逸分析应该在某种程度上对此有所帮助,但是在非常普遍的情况下很难让它很好地工作(请注意,它最近跳入和跳出 JDK 的各种修订版)。

值得一提的是广泛的语言支持(Scala 和 Groovy++ 具有非常好的性能配置文件),并且有许多消息传递并发框架( actorsakkakilim )。

C#/.Net

从语言的角度来看,这可能是最完整的,尤其是当您包含 F# 之类的东西以功能方式处理事物时。然而,如果你想要最好的性能,你通常会被推向 MS 平台(这里的移​​动故事也不是很好)。 Mono 明智地产生了一个非常好的平台功能(警告:我是贡献者)但是他们仍在追赶性能,例如最近添加了一个精确的、压缩的收集器,但仍处于试验阶段。

谷歌去

非常新,但从 native 编译的角度来看很有趣(没有 jit 开销),但仍然具有强大的运行时、内存模型、垃圾收集器和对语言( channel )中 CSP(并发顺序处理)特性的直接支持。可能还有一些路要走,新的 GC 的开发已经开始但尚未浮出水面,而且他们可能从编译器中获得更多。

Haskell 和其他函数式语言

这里的经验并不多,但一些功能性构造(如不变性和持久集合)对于构建健壮的并发应用程序非常有用。

关于java - 哪种语言/框架适用于 HPC : Java/.Net/Delphi/C/C++/Objective-C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3537688/

相关文章:

java - 将字符串和文件发送到 InputStream

java - Java字节码中的 `Stack=1, Locals=1, Args_size=1`是什么意思?

java - 为什么我的 "while(rs.next()) "无法执行我使用过的所有 if、ifelse、else?

.net - 你能在 mdbg 中看到评估堆栈吗?

.net - Winforms 文本框粘贴不可靠?

c++ - 在 std::set<boost::uuids::uuid> 的析构函数中,我在 _int_free 中遇到了段错误(核心已转储)。为什么?

c++ - 静态、共享和可执行 - Windows 和 Linux

java - 当抑制窗口 KTable 的输出时,如何正确实现缓冲区配置?

c# - 如何从数据列中获取数据

c++ - 什么是可变参数函数模板重载优先规则?