实例化 Julia“对象”(调用包装的 C/C++ 函数)时触发包装的 C/C++ 重建

Posted

技术标签:

【中文标题】实例化 Julia“对象”(调用包装的 C/C++ 函数)时触发包装的 C/C++ 重建【英文标题】:Trigger wrapped C/C++ rebuild when instantiating a Julia "object" (that calls the wrapped C/C++ functions) 【发布时间】:2020-11-15 17:35:25 【问题描述】:

我发现以下范例非常有用,我希望能够以某种方式在 Julia 中重现它,以利用 Julia 的速度和 C 包装功能。

我通常在 Python/Matlab 中维护一组对象,这些对象代表管道的块(算法)。设置单元测试等。

然后通过具有包装 C/C++ 的等效 python/Matlab 对象(相同的 API)来开发等效的 C/C++ 代码以实现相同的功能并且必须通过相同的测试(这里我的意思是编写的完全相同的测试python/Matlab 在其中生成合成数据或加载记录的数据)。

我将并行维护完整的 python 和 python/C++ 对象,以通过广泛的测试套件执行奇偶校验。仅 python 和 python/C++ 版本完全可以互换。

每次我需要修改管道的行为或调试问题时,我首先使用我需要修改的特定对象/块的完全 pythonic 版本,通常与以 python/C++ 模式运行的其他块结合使用为了速度,然后更新测试以匹配修改后的 python 块的行为,最后更新 C++ 版本,直到它达到奇偶校验并通过更新的测试。

每次我在块上实例化 Python/C++ 版本时,我都会在构造函数中运行一个“make”,如果有任何修改,它会重建 C++ 代码。确保我始终测试最新版本的 C++。

有没有什么优雅的方法可以用 Julia/C++ 组合重现相同的范例?通过自动测试并行维护 julia/C++ 版本。 IE。如何在实例化对象而不是每个函数调用时只检查/重建一次 C++(这太慢了)。

我想在运行不同块的所有测试之前,我可以在测试套件级别调用一次“make”。但是,如果我正在为调试会话编写一个快速的 Python 脚本,我将不得不手动调用它。

让我们选择一个小过滤器对象的例子,它有一个改变过滤器参数的配置方法和一个过滤传入数据的过滤器方法。

我们会有类似的东西:

f1 = filter('python');
f2 = filter('C++'); % rebuild C++ as needed

f1.configure(0.5);
f2.configure(0.5);

x1 = data;
x2 = data;

xf1 = f1.filter(x1);
xf2 = f2.filter(x2);

assert( xf1 == xf2 )

通常会有一堆测试在python-only模式或python/C++模式下实例化对象并测试它们。

我想我想说的是,因为在 Julia 中,范式是有一个过滤器类型,然后是修改/使用过滤器类型的“外部”方法,所以没有集中的方法来检查/重建它的所有包装 C 代码的方法。除非该类型包含跟踪相关方法的变量列表。看起来很别扭。

我会很感激 cmets / 想法。

【问题讨论】:

为什么不在测试前输入make?另外,我看不出为一个算法保留两个实现的意义。为什么你更信任 Python 实现而不是 C++ 实现? 我知道,在 Python/C++ 的情况下,您需要 Python 进行健全性控制/调试,而 C++ 则需要性能。 Julia 背后的整个想法是您只需编写一次代码 - 它既像 Python 一样可读,又像 C++ 一样快。 保留这两种实现的原因是 C/C++ 是针对嵌入式实时定制专有芯片的。有时我为他们编写程序集或使用根据我们的需要添加的自定义硬件加速器(我们控制芯片设计和 C/C++ 编译器)。在 Matlab/Python 中调试/设计复杂的信号处理算法的能力在 C/C++ 中仍然是无法比拟的。当您有数千个测试或想要实时运行时,Matlab 和 Python 有时会慢得令人讨厌。 我希望如果 Julia 足够成熟,我可以两全其美。快速原型设计,使用多个交互式会话/绘图功能等进行调试,Julia 中的快速测试和强大的实时性能以及嵌入式系统的 C/C++/Assembly 代码的轻松包装。我认为短期内不会为这些嵌入式芯片开发 Julia 编译器。 注意相同的 C/C++ 也可以在 PC/Cluster 上编译。我遗漏了一些细节。事实上它的过程:在 python/matlab 中创建原型,添加测试,包装 C/C++,为 PC/服务器构建,在 PC/服务器上通过相同的测试(在每次提交时运行),为自定义编译 C/C++芯片,在芯片模拟器上通过相同的测试(也包裹在python/matlab中),部署到实际的芯片上,在芯片上通过相同的测试,现在我们完成了。 【参考方案1】:

你有什么理由不能将你的函数包装在这样的结构中?

struct Filter 

    FilterStuff::String
    Param::Int

    function Filter(stuff::String, param::Int)

        # Make the C++ code here

        # Return the created object here
        obj = new(stuff, param)

    end

end

【讨论】:

以上是关于实例化 Julia“对象”(调用包装的 C/C++ 函数)时触发包装的 C/C++ 重建的主要内容,如果未能解决你的问题,请参考以下文章

静态static怎么理解,我只知道静态方法是不用实例化对象,可以直接用对象.方法调用,还有静态啥东东

与字典查找相比,Julia Valc() 似乎很慢

JNI/NDK开发指南——调用构造方法和父类实例方法

JNI/NDK开发指南——调用构造方法和父类实例方法

Javascript 中数组与对象的实例化。数组啥时候是对象,啥时候得到数组的方法?

等效于 Julia 中的 c\c++ 编译器指令