我对如何处理以下问题的任何传统智慧感兴趣。请注意,我是一个硬件人员,所以要小心使用行业知识/术语/首字母缩略词。
我正在提供一个在线应用程序,其中包括非常复杂的数学计算,例如快速傅里叶变换,涉及嵌套的for循环和非常大的数据阵列(每个1.6GB)。 Internet上的用户将访问此应用程序,输入一些自定义参数,并提交调用这些数学计算的作业。为了让用户的等待时间降到最低,并为多个同时用户(每个用户都有一个单独的线程)允许多个独立会话,我想知道如何加快数学计算,我预计这将是一个瓶颈。
我不是在寻找有关如何构建程序的建议(例如,尽可能使用整数数据类型而不是浮动,使用较小的数组等),但是我很感兴趣,一旦程序完成,可以做些什么来加快速度。
例如,如何根据需求自动访问CPU中的多个内核? (这是默认完成的还是我需要以某种方式管理过程?
或者,如何进行并行处理(在多个内核和/或机器之间打破循环)?
非常感谢任何实用建议。我确信我不是第一个需要这样做的人,因此我希望有可行的最佳实践方法随着需求而扩展。
提前致谢!
答案 0 :(得分:4)
FFT方法可高度并行化。特别是在多维度上。
一种方法(取决于可用的硬件)是工作线程池(或进程,取决于配置)。
在我的工作中,我们在PC池和尽可能简单的数据包上取得了很大成功,这些数据包由一台PC排队,计算(以多核方式),并发送回用户。
不要尝试微量优化数学内容,而是使用上述库之一。专注于设计数据包,对计算进行排队(不要忘记某种配额/优先级),确保计算出的数据可靠地发送回必须对数据包进行连接的线程。
根据硬件(巨大的SMP计算机或PC场),问题不同。
(如果您可以选择,请去PC农场。)
编辑:您可能需要考虑使用OpenMP来自动进行并行化循环。至于PC农场,从灵活性的角度来看,它们比大型计算器具有优势:它们可以很好地扩展,它们并不昂贵,并且可以有效地购买/出售/重复使用。 Linux可能是一个不错的选择,但这取决于你习惯的环境。
可悲的是,我必须说(据我所知)没有好的库可以在PC场上可靠而有效地分发计算请求。这个问题很难,因为你必须考虑到故障,网络通信,拥塞,分发过程......
答案 1 :(得分:1)
你没有说明你的设置是什么(java,php,.net你将主持系统还是将它托管在某处)所以这只是一些关于袖口的想法:
据我所知,您可能使用的大多数现代系统都会在可用的处理器核心上传播作业。
通过负载平衡http://www.loadbalancing.org/
,可以相对轻松地将工作负载分散到多个服务器上您还可以查看“云计算”,您的应用程序将由亚马逊等人托管,您支付的费用(或多或少)
其他提供商可用。
我相当确定如果您提供更多详细信息,您将获得更具体的答案。