并行处理大型数据集上的顺序任务的多个评估 - GPU计算的任务?

时间:2012-01-04 00:08:08

标签: parallel-processing scipy opencl gpgpu

我正在研究SciPy中的一些信号处理代码,现在我正在尝试使用数值优化器来调整它。不幸的是,随着这些事情的发展,它变得非常缓慢。

我必须为此优化执行的操作如下:

  • 加载一个大的1-d数据文件(~120000点)
  • 运行优化器,其中:
    • 执行信号处理操作,不修改原始数据,产生120000个新数据点。
    • 使用各种操作检查原始信号和新信号之间的差异,
      • 其中一个包括基于FFT的卷积
      • 生成单个“错误”值以汇总结果 - 这应该是最小化的
    • 查看错误并使用不同参数重新运行操作

信号处理和错误功能需要3秒钟,但不幸的是,它需要花费50,000次才需要更长的时间。我正在尝试各种更有效的优化算法,但无论它需要进行数千次迭代。

我已经尝试了一些我正在尝试使用CPU线程的优化器,这并不太困难,因为优化器可以使用ThreadPool.map在不同的线程上轻松地同时执行多个预定的运行。

但这在我的笔记本电脑上只有大约2倍的加速,或者在多核计算机上大约是8倍。我的问题是,这是一个我可以利用GPU处理的应用程序吗?我已经将代码的某些部分翻译成了C,我可以想象使用OpenCL从一个参数数组创建一个函数到一个错误值数组,并一次运行数百次。 - 即使它慢慢地执行顺序处理部分,一次性获得所有结果也是惊人的。

但是,我的猜测是内存需求(加载一个大文件并生成一个相同大小的临时文件以生成每个数据点)会使得在OpenCL内核中运行整个算法变得困难。我对GPU处理和编写CUDA / OpenCL代码没有多少经验,所以如果没有希望让它工作,我不想开始学习这些细节。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在分析差异之前,您是否需要生成所有120,000个新点?你能算出新的点,然后决定你是否正在收敛?

分数有多大?今天50美元的显卡有1Gb的内存 - 应该足够120K点。我不像Cuda那样熟悉openCL,但是对于纹理内存与一般内存等有多少可能存在限制。

编辑:比OpenCL更熟悉CUDA,但这可能适用于两者 GPU上的内存有点复杂但非常灵活,你可以通过GPU内核读取纹理内存,并且具有一些非常聪明的缓存功能,可以非常快速地访问2d和3d数组中的值。你可以写入openGL内存进行显示,每个线程有一个有限的(16-64k?)缓存

虽然从主内存到GPU的传输速度相对较慢(几GB / s),但显卡上的内存总线速度是此速度的20倍