【发布时间】:2020-08-22 12:31:05
【问题描述】:
用 C++ 编写的软件,只能使用标准 C++ 库。
您好,我遇到的问题如下: 我必须并行化一个软件,但多线程版本的完成时间太随机了,我的意思是 50% 的时间比单个版本快,50% 的时间慢,这是由于我认为错误的设计选择,我会喜欢你告诉我如何纠正它。
该软件基于不断增长的树结构,而不是二进制结构,每个新节点都可能是一个可能的解决方案。一旦软件找到解决方案,程序就会停止。现在的问题是,在顺序版本中,软件计算节点所遵循的路径当然总是相同的,所以它总是需要一个固定的时间来完成任务。在多线程版本中,我有一个任务池,我在其中插入节点,线程不断从任务池中获取作业并推回新节点,但计算顺序当然不是确定性的,所以有时会发生这种情况与多线程版本相比,这种工作方式会导致更多的计算,因此会导致更长的完成时间。
所以,假设有一个不断增长的树结构,给定根,然后将所有节点放入队列中,然后开始计算第一个节点,如果这是一个解决方案,则终止,否则您计算该节点并将所有结果子节点推回队列。有多种解决方案,您不知道它们在哪个节点中,因此您只需要计算它们中的每一个,直到找到解决方案。顺序版本将始终遵循相同的路径,因此在到达第一个解决方案之前总是需要计算 N 个节点,而多线程版本可能不走运,并且采用没有解决方案的不同路径,并且在更多的情况下到达第一个解决方案步骤。
您如何确保多线程版本在达到第一个解决方案之前始终执行最多 N 步?否则,如果您需要计算更多的步骤,那么拥有多个线程的优势将毫无用处。
如果需要,我会发布代码,但正如我所说,它只是一个树结构和一个队列任务池等等。
【问题讨论】:
-
在编写 OP 正在处理的那种程序时,有很多事情可能会出错。但是,我相信有一个单一而明确的问题:“顺序版本将始终遵循相同的路径,因此在达到第一个解决方案之前总是需要计算 N 个节点,而多线程版本可能不走运,并采取不同的方式没有解决方案的路径,并且在更多步骤中达到第一个解决方案。您如何确保多线程版本在达到第一个解决方案之前始终执行最多 N 个步骤?为什么这个问题被关闭了?
标签: c++ multithreading thread-synchronization