关于cuda的问题

sca*_*man 2 architecture cuda gpu

我正在研究GPU编程,并希望了解有关CUDA的更多信息.我已经阅读了很多关于它的内容(来自维基百科,Nvidia和其他参考文献),但我仍然有一些问题:

  1. 以下对架构的描述是否准确?:GPU具有多处理器,每个多处理器都有流处理器,每个流处理器可以同时运行线程块.

  2. 所有引用都声明在一个块内创建的最小线程数是32 ...为什么?

  3. 我有一张ATI Radeon显卡.我能够在没有仿真模式的情况下编译一个简单的CUDA程序!! 我以为我只能在支持的Nvidia VGA上编译和运行CUDA程序.有人可以解释一下吗?

gog*_*ger 6

1 - NVIDIA gpus也是如此.

2 - 这是硬件设计的约束.

3 - 编译在CPU上完成,因此您可以编译程序,就像在x86上交叉编译PPC一样.

如果你想在ATI卡上运行gpu程序,我建议你看一下OpenCL或AMD Stream.


Tom*_*Tom 6

一个CUDA线程非常轻量级,可以安排/停止,只需很少的惩罚.这与CPU线程不同,后者在执行时切换有很多开销.因此,CPU非常适合任务并行,GPU在数据并行性方面表现优异.

  1. 在CUDA架构中,(NVIDIA)GPU具有"流多处理器"(SM),每个处理器将执行一个线程块.每个SM都有一组流处理器(SP),每个流处理器将在任何给定时刻(周期)执行一个线程的指令.

  2. 实际上块内的最小线程数是1.如果每个块只有一个线程,则代码将正确执行.但是,设置块使其具有32个线程的倍数要高效得多.这是由于硬件在"warp"(32个线程)上调度操作的方式.

  3. 您可以交叉编译您的程序.您可以在仿真模式下运行它,即CPU正在"模拟"CUDA GPU,但要在硬件上运行,您需要一个NVIDIA GPU(启用CUDA,最近,2006年左右之后的任何事情都可以).

高端当前的GPU有240个内核(SP),您可以将其视为在任何给定时刻执行240个线程但是将GPU视为同时执行数千个线程非常有用,因为多个线程的状态(上下文)已加载.

我认为重要的是要认识到CPU线程和GPU线程之间存在差异.它们具有相同的名称,但GPU线程是轻量级的,通常在一小部分数据上运行.也许这将有助于考虑一组(一组)CPU线程做非并行工作,然后每个CPU线程分成数千个GPU线程进行数据并行工作,然后它们连接回CPU线程.显然,如果你可以让CPU线程与GPU同时工作,那就更好了.

请记住,与CPU不同,GPU是一种吞吐量架构,这意味着程序应该创建许多线程,而不是使用缓存来隐藏延迟,以便在某些线程等待数据从内存返回时,其他线程可以执行.我建议观看GPU技术大会的"Advanced C for CUDA"演讲,了解更多信息.