GPU中的并行性 - CUDA/OpenCL

gol*_*ean 4 cuda opencl

我对GPU上的CUDA或OpenCL代码中的并行性有一般性的疑问.我使用的是NVIDIA GTX 470.

我在Cuda编程指南中简要阅读,但没有找到相关的答案,因此在这里问.

我有一个调用CUDA内核的顶级函数(对于相同的内核,我有一个OpenCL版本).这个顶级函数本身在我的main函数的'for循环'中被调用3次,用于3个不同的数据集(图像数据R,G,B),并且实际的codelet也对图像/帧中的所有像素进行处理所以它有2'for loops'.

我想知道的是在这里利用什么样的并行性 - 任务级并行性或数据并行性?

所以我想要理解的是,这个CUDA和C代码是否为codelet和顶级代码中的不同功能/函数创建了多个线程,并且并行执行它们并利用任务并行性.如果是,则由于没有明确包含在代码中或与之链接的线程库而创建它.

要么

它为不同的"for循环"迭代创建线程/任务,这些迭代是独立的,从而实现数据并行性.如果它实现了这种并行性,它是否只是通过注意到不同的for循环迭代没有依赖关系并因此可以并行调度来利用它?

因为我没有看到任何特殊的编译器构造/内在函数(在openMP中为循环并行),它告诉编译器/调度程序并行调度这样的for循环/函数?

任何阅读材料都会有帮助.

Mic*_*idl 6

GPU上的并行性是SIMT(单指令多线程).对于CUDA内核,您可以指定每个块具有N个线程的块网格.CUDA库完成所有技巧,CUDA编译器(nvcc)生成GPU执行的GPU代码.CUDA库告诉GPU驱动程序以及GPU上的线程调度程序更多应该执行内核的线程数((块数)x(线程数)).在您的示例中,顶级函数(或主机函数)仅执行异步的内核调用并返回emediatly.不需要线程库,因为nvcc会创建对驱动程序的调用.

内核调用示例如下所示:

helloworld<<<BLOCKS, THREADS>>>(/* maybe some parameters */);
Run Code Online (Sandbox Code Playgroud)

OpenCL遵循相同的范例,但是您在运行时编译了内核(如果它们没有预编译).指定执行内核的线程数,lib完成剩下的工作.

学习CUDA(OpenCL)的最佳方法是查看CUDA编程指南(OpenCL编程指南)并查看GPU计算SDK中的示例.