我的应用程序是一个强力优化器。为了提高性能,我决定使用多线程。该任务很容易兼容 - 分割搜索空间,为每个块使用一个线程,然后合并结果。
在我的带有12个虚拟内核的CPU上,使用多个线程的加速比率高达cca 230%,5个线程。我没有能够显示缓存未命中的探查器,并且当应用程序搜索不适合缓存的对象时,我认为缓存是瓶颈。
然后我在多个实例中启动了应用程序,每个实例都有5个线程。每个实例的平均运行时间与一个独立运行的运行时几乎相同。因此,在没有代码的情况下,速度提高了3倍,缓存似乎不是问题。
我的问题如下:
用于将任务并行化到更多线程上的代码片段是
List<QSettings> xSplittedSettings = mxSettings.split(xThreadCount);
List<Task<QResults>> xTasks = new QList<Task<QResults>>();
for (int xThreadIdx = 0; xThreadIdx < xThreadCount; xThreadIdx++)
{
int xThreadIdx_ = xThreadIdx;
xTasks.add(Task.Factory.StartNew<QResults>(() => performMainCycle(mxCandidate.clone(), xSplittedSettings[xThreadIdx_])));
}
Task.WaitAll(xTasks.toArray());
我已经检查过,当运行多个线程时,每个线程只计算问题的相应部分。我还检查了所有线程同时计算。但是,如果有一个包含5个线程的实例,则任务管理器仅显示正在使用的CPU的15%以上。
非常感谢任何提示, 丹尼尔