如何使用CUDA处理任意大小的任务?

时间:2016-06-13 03:16:10

标签: cuda gpgpu nvidia

我开始学习CUDA,不得不直接进入一个项目,所以我目前缺乏扎实的理论背景;我会一路捡起它。

虽然我了解硬件的构建方式需要程序员处理线程块和网格,但我还没有能够在我的介绍性书中找到以下问题的答案:

  • 当任务大小大于GPU一次可处理的线程数时会发生什么? GPU是否会以与CPU相同的方式继续通过阵列,即顺序执行?
  • 因此,如果给定任务所需的线程数量超过可以同时在GPU上运行的数量,我应该担心吗?我发现了"线程块限制的概念"到目前为止,GPU在某个特定时刻可以处理的内容明显更高,因此,我应该关注的是真正的(也是唯一的)限制吗?
  • 除了为给定硬件选择正确的块大小外,在设置内核执行时是否还有任何问题需要考虑?我对于启动任意大小的任务感到茫然。甚至考虑使用OpenCL而不是CUDA,因为在启动内核以在阵列上执行时似乎没有涉及显式的块大小计算。

我很好,如果是这样的话会被关闭,请务必指出原来的问题。

1 个答案:

答案 0 :(得分:1)

线程块的数量可以是任意的。如果数量很大,硬件可以按顺序处理它们。此链接为您提供基本视图。

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#scalable-programming-model

另一方面,您可以使用有限数量的线程来通过增加每个线程的工作来处理任意大小的任务。此链接向您展示如何做到这一点以及为什么它更好。

https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/

您可能需要阅读以下两个内容以获得完整答案。

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html