Parallel processing 并行处理在大数据集上对一个顺序任务的多次求值——GPU计算任务?

Parallel processing 并行处理在大数据集上对一个顺序任务的多次求值——GPU计算任务?,parallel-processing,scipy,opencl,gpgpu,Parallel Processing,Scipy,Opencl,Gpgpu,我正在用SciPy编写一些信号处理代码,现在正尝试使用数值优化器对其进行调优。不幸的是,随着这些事情的发展,这是一个相当缓慢的过程 我必须为此优化执行以下操作: 加载大型一维数据文件(~120000点) 运行优化器,它: 执行信号处理操作,不修改原始数据,生成120000个新数据点 使用各种操作检查原始信号和新信号之间的差异, 其中之一包括基于FFT的卷积 生成一个“错误”值来总结结果——这是应该最小化的 查看错误并使用不同的参数重新运行操作 信号处理和错误函数需要不到3秒的时间,但

我正在用SciPy编写一些信号处理代码,现在正尝试使用数值优化器对其进行调优。不幸的是,随着这些事情的发展,这是一个相当缓慢的过程

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

  • 加载大型一维数据文件(~120000点)
  • 运行优化器,它:
    • 执行信号处理操作,不修改原始数据,生成120000个新数据点
    • 使用各种操作检查原始信号和新信号之间的差异,
      • 其中之一包括基于FFT的卷积
      • 生成一个“错误”值来总结结果——这是应该最小化的
    • 查看错误并使用不同的参数重新运行操作
信号处理和错误函数需要不到3秒的时间,但不幸的是,执行50000次需要更长的时间。我正在试验各种更有效的优化算法,但不管怎样,都需要数千次迭代

我已经使用CPU线程对我正在尝试的几个优化程序进行了并行化,这并不太困难,因为优化程序可以使用
ThreadPool.map
轻松地在不同的线程上同时执行多个计划运行

但这在我的笔记本电脑上只需要2倍的速度,在多核电脑上可能需要8倍的速度。我的问题是,这是一个我可以利用GPU处理的应用程序吗?我已经将部分代码翻译成了C语言,我可以想象使用OpenCL创建一个从参数数组到错误值数组的函数,并一次运行数百次即使它执行顺序处理部分的速度很慢,在一次拍摄中获得所有结果也会令人惊讶

然而,我的猜测是,内存需求(加载一个大文件并生成一个大小相等的临时文件以生成每个数据点)会使整个算法难以在OpenCL内核中运行。我在GPU处理和编写CUDA/OpenCL代码方面没有太多经验,所以如果没有希望,我不想开始学习细节


有什么建议吗?

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

积分有多大?如今,一张50美元的显卡有1Gb的内存,足够12万积分了。我对openCL的熟悉程度不如Cuda,但对于纹理内存和普通内存的使用量可能也有限制

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


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

不幸的是,是的,在生成结果后,我需要分析这两个向量的相互“整体”。(用于计算相关性。)数据点是双精度的,但不一定必须是双精度的。32位可能会给我不错的结果。内存确实不贵,但我真的不知道如何在CUDA或OpenCL(两者都可以)中分配内存。据我所知,记忆模型比你需要的任何东西都要复杂,但我可能错了。这就是为什么我要问:)我应该澄清我对内存的担忧:并不是我担心在1GB中安装120000个点。(120000x8=0.0009 GB)。相反,我担心的是一次运行该算法数千次,而每一次都需要相同的内存量。不管怎么说,我想这是我必须试着去看的事情之一。即使我一次只能做几百次,这也将是一个巨大的加速,所以这可能是值得的。