连续仿真-性能调整-GPU / CPU

时间:2018-07-23 10:04:52

标签: c# gpu cpu simulation

我为采矿业构建了一个连续的仿真模型(基于状态)。跟踪设备用于工程和生产目的,其中在发生故障(例如故障,生产事件等)时更新设备状态。使用许多统计分布。为了便于说明,请参见下面的代码,以了解模拟的工作原理。

我正在尝试优化性能。基本上需要运行数千个“案例”。我可以根据可用的物理线程数量并行运行x个案例。因此,CPU的工作速度为100%。

1000例病例可能需要一天以上的时间才能运行。

从应用程序的结构来看,是否有机会介绍GPU计算?我从未使用过GPU进行编程,并且想知道我是否有机会以某种方式将GPU包括在我的计算中。任何其他建议也将不胜感激。

public static void RunAll()
{
   //This list contains thousands cases
   List<SimCase> simCases = ImportCases()

   //List which contains simulation results
   ConcurrentBag<Results> resultsList = new ConcurrentBag<Results>();

   //Runs cases in parallel (consumes all threads)
   Parallel.ForEach(simCases, simCase =>
   {
      var results = RunSimulation(simCase);
      resultsList.Add(results);
   });

  //Interpret results and build report
}

public static Results RunSimulation(SimCase simCase)
{
   Results results = new Results();

   DateTime currentDate = new DateTime(2018,1,1);
   DateTime finalDate= new DateTime(2018,12,31);

   while (currentDate < finalDate)
   {
      //Many if statements

      //Many object updates

      //Many functions calls to libraries for statistical calcs

      //Updates simulation time
      currentDate = currentDate.addSeconds(1);
   }

   return(results);
}

1 个答案:

答案 0 :(得分:0)

对于我来说,GPU似乎无济于事,因为我的程序在很大程度上依赖于第三方数学库(如果有语句和对象迭代/更新)。以下是使我性能提高50%的原因:

  • 将所有.Count()更改为.Count on Lists
  • 将所有.Count()更改为.Length在数组上
  • 将IEnumerable集合上的.Count()== 0表达式更改为.Any()

我将投资32线程CPU以大大加快工作速度。