0

我刚刚开始学习如何进行 CUDA 开发(使用版本 4),并且想知道是否可以在我打算使用的不同卡上进行开发?据我所知,很高兴知道这一点,这样我就可以密切关注差异是否会影响我。

我有一个 2010 年中期的带有 Nvidia GeForce 320M 显卡的 macbook pro(它是一个非常基本的笔记本电脑集成卡),但我计划在 EC2 的 NVIDIA Tesla “Fermi” M2050 GPU 上运行我的代码。我想知道是否可以在我的笔记本电脑上进行本地开发,然后在 EC2 上以最小的更改运行它(我这样做是为了个人项目,不想花 2.4 美元进行开发)。

一个具体的问题是,我听说较新的卡(可能不在我的笔记本电脑中)支持递归,如果我在笔记本电脑的 gpu 上运行递归怎么办?它会踢出错误还是会运行但不利用硬件功能?(我不需要对此的具体答案,但这就是我所得到的)。

如果这将是一个问题,是否有我当前卡中没有的功能的模拟器?还是 SDK 会为我模拟它?

对不起,如果这个问题太基本了。

4

3 回答 3

3

是的,使用不同的 GPU 进行开发和生产是很常见的做法。nVidia GPU 代是向后兼容的,因此如果您的程序在旧卡上运行(即如果 320M (CC1.3)),它肯定会在 M2070 (CC2.0) 上运行)。

但是,如果您想获得最大的性能,您应该在您将要使用它的相同架构上对您的程序进行概要分析,但是从 1.x 迁移到 2.0 时,通常一切都运行良好,没有任何更改。任何模拟器都比在不管旧的 GPU 上运行时所提供的更糟糕的视图。

关于递归:尝试为 1.3 架构编译具有明显递归的程序会产生编译时错误:

nvcc rec.cu -arch=sm_13
./rec.cu(5): Error: Recursive function call is not supported yet: factorial(int)

在更复杂的情况下,程序可能会编译(我不知道编译器在检测递归方面有多聪明),但肯定不会工作:在 1.x 架构中没有调用堆栈,所有函数调用实际上都是内联的,所以递归在技术上是不可能的。

但是,我强烈建议您不惜一切代价避免递归:它违背了 GPGPU 编程范式,并且肯定会导致性能非常差。大多数算法在不使用递归的情况下很容易重写,而且使用它们是更可取的方式,不仅在 GPU 上,在 CPU 上也是如此。

于 2012-05-06T18:50:05.657 回答
2

Cuda 版本起初并不那么重要。更重要的是卡的计算能力。

如果您使用 cc 1.0 对内核进行编程并且它们在未来是可扩展的,那么您将不会遇到任何问题。

为您的应用选择所需的最低 cc 级别。

使用属性计算必要参数并使用 ptx jit 编译:

如果您的内核可以处理任意输入大小的数据,并且您的内核启动配置可以跨数千个线程扩展,那么它将跨未来版本扩展。

在我的项目中,我的所有内核都使用每个块的固定线程数,这等于每个流式多处理器的常驻线程数除以每个流式多处理器的常驻块数,以达到 100% 的占用率。一些内核每个块需要两个线程数的倍数,所以我也处理了这种情况,因为并非对于所有 cc 版本,上述等式都保证了两个块大小的倍数。

一些内核使用共享内存,它的大小也被 cc 级别的属性扣除。

此数据是在实用程序类中使用 (cudaGetDeviceProperties) 接收的,并且使用 ptx jit 编译我的内核在所有设备上都没有任何更改。我在 cc 1.1 设备上编程并在最新的 cuda 卡上运行测试,没有任何更改!

所有内核都被编程为使用 64 位长度的输入数据并利用 3D 网格的所有维度。(我很确定一年后我会继续从事这个项目,所以这是必要的)

我所有的内核除了一个没有超过 cc 1.0 寄存器限制,同时具有 100% occ。因此,如果使用的卡 cc 低于 1.2,我在内核中添加了一个 maxregcount 命令以仍然强制执行 100% occ。

这并不能保证最佳性能!

为了获得可能的最佳性能,应就其参数和资源对每个内核进行分析。

这可能不适用于所有应用程序和要求

于 2012-05-06T18:53:16.760 回答
0

带有 CUDA 5 的 NVidia Kepler K20 GPU 将于 2012 年第四季度推出,将支持递归算法。

于 2012-05-25T15:57:00.647 回答