连续模拟 - 性能调整 - 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 以大大加快速度。
我为采矿业构建了一个连续仿真模型(基于状态)。出于工程和生产目的跟踪设备,其中设备状态在事件发生时更新,例如故障、生产事件等。使用许多统计分布。出于说明目的,请参阅下面的代码以了解模拟的工作原理。
我正在尝试优化性能。基本上几千个'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 以大大加快速度。