我的单线程程序只使用25%的CPU和2个核心(intel i5-3210M)。为什么不是50%(一个核心)?程序正在使用Windows 7 64在macbook pro上进行测试。我认为这个问题是超线程的,因为这个程序只使用一个逻辑内核(占CPU功率的25%)。如何为程序提供更多CPU能力? 这对我来说很重要,因为这个程序适用于大量数据,完成计算大约需要30个小时。
答案 0 :(得分:0)
正如您所说的CPU(具有4个逻辑处理器)所说的那样。您可以搜索转换程序的方法,以便使用多个线程。我建议你搜索“并行编程”,“并发编程”,“多线程”。如果你正在使用MS VC ++ PPL库是如此易于使用.OpenMP是一个更加强大的工具,也可以在Linux中使用。这个问题还有很多方法和库,但你需要根据你的操作系统,编译器,环境,编程语言和你的问题来选择它。
然而,最简单的解决方案是在具有更好CPU的桌面计算机上运行它并交叉手指以尽快获得结果。
答案 1 :(得分:0)
该程序仅使用一个逻辑核心(占CPU功率的25%)。如何为程序提供更多CPU能力? ...这个程序适用于大量数据......完成计算大约需要30个小时。
将您的数据集划分为(至少)4个单独的部分。有了这么多数据,您需要根据索引来考虑数据而不是将数据元素复制到4个单独的结构中。为数据的每个段创建一个单独的线程,并让该线程只处理一个段。您可能需要为线程设置处理器关联。
如果数据流或必须按顺序处理,请考虑排队元素进行处理,然后各个线程将出列并处理每个项目。当排队操作与处理项目相比相对较快时,这很有效,并且可以由单个主线程完成,而每个出队/处理操作都更昂贵。
选择正确数量的线程很棘手。现代CPU和操作系统旨在不时地切换任务。这将是一项昂贵的操作,但调度程序将需要经常做其他事情,即使您的过程看起来像是最佳候选人。因此,通常可以通过将CPU过载到一定程度来获得最佳吞吐量,这样每个逻辑CPU可能需要两个或三个线程。管理此问题的一种方法是使用ThreadPool
对象。