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

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


我正在尝试优化性能。基本上需要运行数以千计的“案例”。根据我可用的物理线程数量,我可以并行运行 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);

}



ibeautiful
浏览 165回答 1
1回答

繁星淼淼

在我的情况下,GPU 似乎没有多大帮助,因为我的程序严重依赖第三方数学库,if 语句和对象迭代/更新。以下是让我提高 50% 性能的原因:在列表上将所有 .Count() 更改为 .Count在数组上将所有 .Count() 更改为 .Length在 IEnumerable 集合上将 .Count() == 0 表达式更改为 .Any()我将投资一个 32 线程 CPU 以大大加快速度。
打开App,查看更多内容
随时随地看视频慕课网APP