0

我目前正在开发一个包含遗留 c 代码(SPICE 变体)的性能关键应用程序。

问题如下:

遗留 c 代码的创建者显然认为使用参数传递是现代最大的弊端之一。因此,大约 90% 的变量是全局声明的。

为了模拟目的,必须重复调用遗留代码,并且使用线程并发调用此代码部分将有利于整体执行时间。

我的想法是封装遗留的 c 代码(我已经为 g++ 编译稍作修改),以便可以创建遗留代码的多个对象,从而消除了许多互斥锁的必要性。显然,全局变量将因此被封装为成员变量。

这带来了另一个问题。遗留编码器也不相信全局变量的初始化;可能是因为 C 倾向于将全局变量初始化为 0。但 C++ 成员变量并不能获得相同的处理。一些变量必须初始化为 0 才能正确操作遗留 c 代码。但事实证明,由于使用了大量的全局变量,因此很难找到这些变量。

请记住,时间不允许我对遗留的 c 代码进行任何主要程度的修改。

我的问题如下:

  1. 我认为 C 代码的封装会比使用大约 90 个互斥锁更快的假设是否正确?

  2. 有没有一种简单的方法可以找到未初始化的成员变量使用?(据我了解 gcc 只能对自动变量执行此操作)。这样我就可以只初始化关键变量?

  3. 如果不是问题 2 ...是否有一种快速而干净的方法来初始化所有成员变量而不使用普通的构造函数 init 方法?

  4. 或者(长镜头)是否有一种遵循程序流程的快速方法,以便我可以结合自己传递的参数?

任何帮助将不胜感激。注意

4

3 回答 3

3
  1. 是的。如果您可以将状态放入您传递指针的对象中,那么它将比锁定更快,假设您确实使用线程。
  2. 不,要找出未初始化的成员变量并不容易。本质上,这需要执行整个代码分析,而这通常是做不到的(由于库的存在)
  3. 如果你把所有数据放在一个旧式结构中(即没有方法,没有访问声明),你可以 memset() 整个结构为零。这将以与初始化全局变量相同的方式导致初始化(C 确实保证初始化 - 为零)。
  4. 如果快速,您的意思是“自动”,那么答案可能是“否”。
于 2009-10-03T09:19:22.660 回答
1

如果您要使用多个线程,则需要消除或锁定线程之间共享的数据。使旧的、非线程安全的代码可重入意味着大量的工作和大量的调试。如果您没有太多时间深入研究遗留代码,我不会尝试。你正在打开一大罐蠕虫。

  • 您可以使用 -fno-common 确保 g++ 中全局变量的初始值为 0。请参阅 gcc 手册。

  • 我认为你最好追求使用多进程而不是多线程的建议。每个进程都有自己的地址空间,您不必触及遗留代码中的任何内容。我会非常努力地寻找一种方法来在流程级别分解您的问题。(例如,不要为每个呼叫都这样做,而是针对逻辑上独立的问题块做大:比如一次批量 1000 个电路。)

  • 在优化之前,首先要认真研究一下为什么它很慢。使现有的串行代码并行化是一项非常艰巨的工作,可能会带来有限的回报。你确定那是你想要做的。

问候, 马特

于 2009-10-03T22:42:01.603 回答
0

你有没有想过只用叉子而不是做一个 oo-spice?它似乎只需要对代码进行很少的更改,除非您尝试对非常小的模型进行大量分析,否则在性能方面可能不会太昂贵。

于 2009-10-03T10:52:03.877 回答