使用更多线程会带来很小的性能提升,使用更多应用程序会带来更多

时间:2016-08-03 17:21:30

标签: c# multithreading performance caching

我的应用程序是一个强力优化器。为了提高性能,我决定使用多线程。该任务很容易兼容 - 分割搜索空间,为每个块使用一个线程,然后合并结果。

在我的带有12个虚拟内核的CPU上,使用多个线程的加速比率高达cca 230%,5个线程。我没有能够显示缓存未命中的探查器,并且当应用程序搜索不适合缓存的对象时,我认为缓存是瓶颈。

然后我在多个实例中启动了应用程序,每个实例都有5个线程。每个实例的平均运行时间与一个独立运行的运行时几乎相同。因此,在没有代码的情况下,速度提高了3倍,缓存似乎不是问题。

我的问题如下:

  1. 什么可能阻碍使用更多线程产生的加速,知道缓存/内存带宽不是原因,也没有可用的计算能力?
  2. 我可以使用哪些工具来查找原因(例如,假设此问题可能有更多原因)?
  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%以上。

    非常感谢任何提示, 丹尼尔

0 个答案:

没有答案