【问题标题】:C# Neural Network OptimizationC# 神经网络优化
【发布时间】:2016-05-10 15:32:13
【问题描述】:

我有一个程序,我在其中使用了一个庞大的神经网络来处理近 100 个物体,这些物体在进化状态下四处移动并相互作用。现在,我每次计算完屏幕后都会拍一张照片,这可能需要几个小时。在 youtube 上,我看到了足球神经网络示例和其他人们可以“直播”神经网络的示例。我有哪些方法可以非常快速地运行脚本?这与我当前的代码无关,因为我希望这适用于我所做的任何事情,比如我可以管理大量信息的视频游戏,我知道这是可能的,因为我玩管理大量信息的视频游戏.根据我的研究,似乎多线程可能是我的解决方案。是否有任何其他库可以为大规模计算提供支持? C# 对于大规模计算来说是一种糟糕的语言吗?感谢您的支持。

--编辑 1-- 它导致延迟的瓶颈是由于 for 循环每 1/10 秒进行大约 50,000 次。每次只计算几个字节。分析告诉我这是造成延迟的原因。

--编辑 2-- 回应评论,我未来的希望是做面部识别,有直播。

【问题讨论】:

  • 你的问题太宽泛了。在开始提供帮助之前,我们需要查看一些实际代码。您是否自己对代码进行了任何分析以找出瓶颈所在?
  • 您对如何提出这个问题有什么建议吗?经过数小时的研究,网上似乎没有人知道任何真正好的方法,除了线程和多 CPU 方法,我的目标计算机无法做到。
  • 只需使用多线程和 SIMD 以及任何不是魔法的东西,如果您想要真正快速的东西,您将需要做更少的工作 - 即使用更小的网络。
  • @Evan_K2014 我知道你可能不想分享你的“秘诀”,但很难告诉你如何在没有看到问题代码的情况下优化某些东西。

标签: c# multithreading networking optimization


【解决方案1】:

如果你的瓶颈是循环开销,那么处理这个问题的方法是在一个循环中做更多的事情。例如:

预优化循环:

var ints = new int[1000];

for (var x = 0; x < 1000; ++x)
{
    //do work on one element
}

优化后循环:

for (var x = 0; x < 1000; x += 10)
{
   //do work on x + 0
   //do work on x + 1
   //do work on x + 2
   //do work on x + 3
   //do work on x + 4
   //do work on x + 5
   //do work on x + 6
   //do work on x + 7
   //do work on x + 8
   //do work on x + 9
}

同样可以通过一次处理更大的块来处理流。

如果您正在使用数组并且有幸让它们成为 blittable,那么您可以使用指针绕过对访问的数组边界检查,以及 - 通常 - 通过使循环变量消除索引到内存地址的转换指针而不是索引。

任何 Code Complete 系列书籍的优化章节都会教您所有这些以及更多内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2012-12-29
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2018-11-18
    相关资源
    最近更新 更多