我正在研究SciPy中的一些信号处理代码,现在我正在尝试使用数值优化器来调整它。不幸的是,随着这些事情的发展,它变得非常缓慢。
我必须为此优化执行的操作如下:
信号处理和错误功能需要3秒钟,但不幸的是,它需要花费50,000次才需要更长的时间。我正在尝试各种更有效的优化算法,但无论它需要进行数千次迭代。
我已经尝试了一些我正在尝试使用CPU线程的优化器,这并不太困难,因为优化器可以使用ThreadPool.map
在不同的线程上轻松地同时执行多个预定的运行。
但这在我的笔记本电脑上只有大约2倍的加速,或者在多核计算机上大约是8倍。我的问题是,这是一个我可以利用GPU处理的应用程序吗?我已经将代码的某些部分翻译成了C,我可以想象使用OpenCL从一个参数数组创建一个函数到一个错误值数组,并一次运行数百次。 - 即使它慢慢地执行顺序处理部分,一次性获得所有结果也是惊人的。
但是,我的猜测是内存需求(加载一个大文件并生成一个相同大小的临时文件以生成每个数据点)会使得在OpenCL内核中运行整个算法变得困难。我对GPU处理和编写CUDA / OpenCL代码没有多少经验,所以如果没有希望让它工作,我不想开始学习这些细节。
有什么建议吗?
答案 0 :(得分:0)
在分析差异之前,您是否需要生成所有120,000个新点?你能算出新的点,然后决定你是否正在收敛?
分数有多大?今天50美元的显卡有1Gb的内存 - 应该足够120K点。我不像Cuda那样熟悉openCL,但是对于纹理内存与一般内存等有多少可能存在限制。
编辑:比OpenCL更熟悉CUDA,但这可能适用于两者 GPU上的内存有点复杂但非常灵活,你可以通过GPU内核读取纹理内存,并且具有一些非常聪明的缓存功能,可以非常快速地访问2d和3d数组中的值。你可以写入openGL内存进行显示,每个线程有一个有限的(16-64k?)缓存
虽然从主内存到GPU的传输速度相对较慢(几GB / s),但显卡上的内存总线速度是此速度的20倍