Optimization 令人尴尬的CUDA并行计算,如何开始?

Optimization 令人尴尬的CUDA并行计算,如何开始?,optimization,parallel-processing,cuda,Optimization,Parallel Processing,Cuda,我需要加速我现在用PyLab做的许多计算。我想用CUDA。整个计算单元(A)包括进行几个(数千)完全独立的较小计算(B)。在初始阶段,每种方法都需要进行40-41次独立的、甚至更小的计算(C)。所以并行编程应该真的有帮助。对于PyLab,整个过程(A)需要20分钟,(B)大约需要十分之一秒 作为这个领域的初学者,我的问题是我应该在什么级别并行计算,无论是在(C)还是在(B) 我应该澄清,(C)阶段包括获取所有(C)进程之间共享的一组数据(数千个浮点),并执行各种任务,其中最耗时的是线性回归,它也

我需要加速我现在用PyLab做的许多计算。我想用CUDA。整个计算单元(A)包括进行几个(数千)完全独立的较小计算(B)。在初始阶段,每种方法都需要进行40-41次独立的、甚至更小的计算(C)。所以并行编程应该真的有帮助。对于PyLab,整个过程(A)需要20分钟,(B)大约需要十分之一秒

作为这个领域的初学者,我的问题是我应该在什么级别并行计算,无论是在(C)还是在(B)

我应该澄清,(C)阶段包括获取所有(C)进程之间共享的一组数据(数千个浮点),并执行各种任务,其中最耗时的是线性回归,它也是可并行的!每个过程(C)的输出是一个浮点。每个计算(B)基本上包括多次执行过程(C)和对得出的数据进行线性回归。它的输出也是一个单浮点数


我不熟悉CUDA编程,所以我基本上是在问什么是最明智的策略。在决定如何(以及是否)将项目转换为CUDA时,一个重要的考虑因素是代码需要什么类型的内存访问模式。GPU以32个线程(称为warp)为一组运行线程,为了获得最佳性能,warp中的线程应该以一些基本模式访问内存,这些模式在CUDA编程指南(CUDA随附)中有描述。一般来说,访问模式越随机,内核越有可能受到内存限制。在这种情况下,GPU中的计算能力无法充分利用

当GPU中的计算能力无法充分利用时,另一种主要情况是存在条件逻辑和循环,导致扭曲中的线程通过不同的代码路径运行,因为GPU必须通过每个代码路径运行扭曲中的所有线程

如果您发现这些问题可能会导致代码出现问题,您还应该做一些研究,看看是否有已知的替代方法来实现代码,以便在GPU上更好地运行(通常情况下)


如果你看到你的问题,根据上面的考虑,在哪一个层次上并行计算,可能会清楚做出哪一个选择。

在提交CUDA之前,你可能想考虑利用多个CPU核,SIMD等。@如果SIMD的编码意味着在SIMD指令集之一的汇编中手工编码,那么我不同意您可能想在CUDA之前考虑SIMD。在这种情况下,CUDA的编码要容易得多(因为您是用C/C++编写的),并且会产生更快的代码(如果您的系统异常平衡,CPU速度非常快,GPU速度较慢,则可能会出现例外)。像Microsoft PPL或AMP这样的技术可以生成SIMD代码,但它们有自己的学习曲线,开始使用它们可能并不容易(尽管我没有检查)。@Roger Dahl:SIMD和GPGPGPU都有利弊,“最佳”解决方案将取决于应用程序的性质,例如,对于分布范围广、生命周期长的生产代码,其参数将与单台机器上运行的研发代码非常不同。话虽如此,根据我的经验,SIMD比GPGPU适用于更大的问题领域,具有更简单的学习曲线,更易于移植,并且比GPGPU具有更少的约束。请注意,C/C++参数实际上并不适用,因为SIMD可以使用内部函数进行编码。@PaulR:我同意,一般来说,最佳解决方案取决于应用程序的性质。我的评论是基于OP想要加速我假设的内部应用程序(因为它是在PyLab下运行的)。内部函数仍然是汇编语言,所以我不明白这是如何否定C/C++参数的。我很想了解更多关于你们在这方面的想法,所以我在聊天中设置了频道。如果你有时间,请顺便来看看@罗杰:当然-我会在聊天帖上发表评论。。。