图像处理和机器学习中的 Ada 状态 [关闭]
Posted
技术标签:
【中文标题】图像处理和机器学习中的 Ada 状态 [关闭]【英文标题】:Ada state in Image processing and Machine learning [closed] 【发布时间】:2021-12-19 21:40:36 【问题描述】:我和 Ada 一起做一些数学项目。之后,我发现 Ada 可以与 Fortran 和 C/C++ 等低级和高性能语言交互。它也擅长并发处理(我不知道它是否与并行处理相同)。现在,我想做机器学习和图像处理项目。速度和内存对我来说非常关键,必须优化。
我的问题是:
Ada 是否有一个很好的机器学习或图像处理库或两者兼而有之?在 Ada 而不是 python 或 Matlab 中数学性能的速度如何?
Ada 内核和 C/C++ 之间的接口是否用于机器学习,以及图像处理会带来良好的速度?使用并发处理的属性怎么样?
Ada 可以与 Julia 和 Python 建立接口吗?
【问题讨论】:
关于性能的最佳答案是对代码进行基准测试。在互联网上搜索“Ada 基准与 C++”。 分析和基准测试取决于算法的效率和算法的实现。此外,还可以利用平台硬件,例如核心和缓存等等。 FWIW、FORTRAN 和 Algol 具有出色的数学性能。 Prolog 和 LISP 非常适合机器学习。也许,最好的语言是你最熟悉的语言。 如果它可以使用C++代码,它可以与OpenCV接口。 -- 任何数字运算都使用 GPU 见C or Ada for engineering computations? (closed, deleted, hidden);主持人:请考虑投票取消删除/重新打开。引用 T.E.D 的话,“我曾经看到一个人得到了与 gcc C 版本的字节相同的 gnat "Hello world" 实现......” 【参考方案1】:Ada 中的图像处理/ML 库:我不知道有任何 Ada 本地库用于这方面,但您可以很容易地在 C/C++ 中使用任何类似的库。还要检查Alire,它是 Ada 的包管理器。它还很年轻(最近几个月发布了 1.0 版),但社区非常活跃。
处理速度:类似于 C 或 C++,或多或少,肯定比 Matlab 或 Python 快,因为 Ada(如 C/C++)是编译的。 使用 Ada,您有时可以稍微降低速度(一些百分比),因为编译器插入检查以验证没有缓冲区溢出、值超出范围等。在绝大多数情况下,鲁棒性、安全性、易于调试和从检查中获得的维护绝对值得小幅减速。如果即使是这几个 % 对您来说也很重要,您可以尝试选择性地禁用代码中最耗时的部分中的检查。
Ada 内核和 C/C++ 之间的接口是否用于机器学习,以及图像处理会带来良好的速度? 老实说,这个问题对我来说并不完全清楚。我正在解释它,因为您询问是否通过使用 Ada 的 C/C++ 库进行 ML/图像处理来获得良好的性能。
当然,您的里程可能会有所不同,但总的来说,我希望答案是是的。编译后,从 Ada 调用 C/C++ 函数没有任何开销,如果您决定编写一个“厚层”将类 C 接口(通常非常低级,带有指针和东西)转换为一个更 Ada-ish 的界面。通常由厚层完成的转换是为了做一些类型转换和移动一些数据,因此开销是最小的。
关于并发 我猜你的意思是使用 Ada tasks
和 C/C++ 库。好吧,在这种情况下,我想很大程度上取决于您的计算机。 ML 和图像处理是 CPU 密集型任务,因此只有在您的计算机上有多个 CPU 时才能有所收获(如果这些任务执行了一些 I/O,您可以在另一个任务等待时移动一个任务)。
注意:检查 C/C++ 库是否是任务安全的,也就是说,它可以同时被两个不同的任务使用,而不会有破坏其内部结构的风险。
如果它不是任务安全的,您可以使用受保护的对象为您的库提供“任务安全层”。在这种情况下,我想知道是否值得付出努力,因为图书馆(我预计它将完成大部分工作)当时只能由一项任务使用。
与 Julia 和 Python 的接口:老实说,我没有这方面的经验。如果 Julia 和 Python 有一个 C 代码接口(现在通常每种脚本语言都有),那么您也可以将它们与 Ada 接口,也许通过使用一个小的 C“网关”。 有时我在使用 script-C 接口时遇到的一个问题是,它们有时依赖 C 宏来获取常量或内联函数。当然,Ada 看不到 C 宏,有时最简单的解决方案(恕我直言)是使用能够“看到”宏的小型 C“网关”。
【讨论】:
请注意,Python 也可以像 C++ 或 Ada 一样编译。它并不总是被解释,因此可能会环顾四周以确保它实际上在所有情况下都较慢。 “肯定比 Matlab 或 Python 快,因为编译了 Ada(如 C/C++)。” MATLAB 实际上是编译的,它已经有 15 年的时间了。奇怪的是,其中一些误解如何持续这么久。【参考方案2】:第一步(将图像加载到内存中),您可以使用 GID 开源库:
https://gen-img-dec.sourceforge.io/
https://github.com/zertovitch/gid
就处理本身而言,如果您使用 GNAT,您将获得与 C 相同的性能。
【讨论】:
【参考方案3】:其他人已经提出了较早的问题。
对于 Julia 接口,有一些用户库,我想到了这个: http://www.dmitry-kazakov.de/ada/components.htm#Julia
对于 Python,AdaCore 在其 GNATCOLL 库中有一些工具: https://www.adacore.com/gems/gem-106-lady-ada-kisses-python-part-2
【讨论】:
我真的很失望。 Ada语言教程说它很适合多语言编程。但是,它不与 C++ 或 R 或 ... 接口。唯一的选择是 Fortran 和 C 和 COBOL(我认为最后一个不算)。 @ALIN 它还与 C++ 和 Java 交互。 Ada Gnoga 库与 javascript 和 html5 交互。比您想象的要多得多。以上是关于图像处理和机器学习中的 Ada 状态 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章