是否可以'parallelize'此程序?
Is it possible to 'parallelize' this program?
原始程序有大约100个"公司"对象,这些对象在将自己的属性与相邻公司的属性进行比较后计算出整数"价格"。
公司之间的关系可以是"循环的"。在某些时候,公司[99]将需要来自公司[98]和公司[0]的信息来产生价格。公司[0]将在查看公司[99]和公司[1]后自行更新。
该程序目前大约需要一分半钟才能完成。我们正试图使程序适应超级计算机,以便它可以在类似的时间内处理数百万家公司。因此,我们需要并行化该程序以在多个处理器上工作。
问题:
当每个公司需要等待前一家公司计算信息才能计算自己的信息时,是否真的可以并行化该程序?
我的直觉和经验表明这是不可能的,但多线程编程对我来说是一个新的领域,我以前对聪明的设计感到惊讶。
通常,在前向时间演化算法中,就像你描述的那样,所做的"近似"是 t+1 处所有元素的值仅取决于 t 处元素的值。示意图表示为:
time | elements
t | ... [i-1] [i] [i+1] ...
| | /
t+1 | ... [i] ...
如果是这种情况,那么是的,您可以并行化更新,因为它们是独立的。最简单的方法是让每个线程(或其他类型的逻辑工作单元(更新集合的相等部分(因此将工作细分为 N 个部分(。
当然,如果您想执行以下操作:
time | elements
t | ... [i-1] [i] [i+1] [i+2] ...
_____|___________|_/__|___|________
| ... [i] | | ...
t+1 | | /
_____|_...____________[i+1]______...
那么你就不走运了,因为[i+1]
依赖于 [i] 的 T+1 值,因此没有并行化选项。
这与多线程技术没有任何关系,当您的算法需要它时会使用多线程,请注意这里的关键词是算法。
编程语言最终只是语言,算法以及思维和设计算法的方式定义了我们将如何获得预期的结果。
因此,要回答您的问题,根据我现在掌握的有关您的情况的信息(接近 0%(,我只能说这在逻辑上是不可能的,正如您所描述的那样,做您想做的事情。
有一个可能的解决方法,那就是使每个节点都有初始值(如firm[0](,您甚至可以使算法更智能一点,并设计某种数学函数来从同一/以前的公司中以前使用的数据输出初始数据,但我认为这会破坏整个算法! 所以也许你应该考虑在数学上重新设计整个算法,因为你的代码工作正常,并且您有数据要测试!
我唯一担心的是,您的公司正在提供大型机解决方案(或者我认为应该是云解决方案(,为数百万可能的用户提供服务,但还没有考虑聘请项目分析团队来检查算法并尝试修复它以适应请求的场景,然后再将其传递给编程团队进行实施!!
更新
由于您正在使用 N 个节点作为公司,您可以考虑创建 N 个线程(即:每个节点一个(和一个将从每个线程收集信息的主线程,现在这并不意味着它是一个多线程解决方案(逻辑上,因为主进程几乎一直处于空闲状态/等待数据(, 但从另一个角度来看,每个节点进程都可以将其数据提交到主进程并重新开始工作,主进程将是等待来自进程编号 i (0
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 是否可以'parallelize'此程序?