连续模拟 - 性能调整 - GPU/CPU

Continuous Simulation - Performance tuning - GPU/CPU

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

我正在尝试优化性能。基本上几千个'cases'需要运行。根据我可用的物理线程数量,我可以 运行 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);
}

GPU 似乎对我的情况没有多大帮助,因为我的程序严重依赖第三方数学库,if 语句和对象 iterations/updates。使我的性能提高 50% 的是以下内容:

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

我将投资一个 32 线程 CPU 以大大加快速度。