我想在CUDA中实现一个算法,该算法接受大小为N的输入,并使用N ^ 2个线程执行该算法(这是特定算法单词的方式)。我被要求制作一个程序,最多可以处理N = 2 ^ 10。我认为,对于我的系统,给定的线程块最多可以具有512个线程,但是对于N = 2 ^ 10,拥有N ^ 2线程将意味着拥有N ^ 2/1 512 = 2 ^ 20/512块。我在此链接(http://www.ce.jhu.edu/dalrymple/classes/602/Class10.pdf)处看到,您的块数“可以高达65,535(或更大的2 ^ 31-1)”。
我的问题是:
1)如何找到实际的最大块数?我不确定引号^^表示“ 65,535(或更大的2 ^ 31-1)”的含义,因为这些数字显然非常不同。
2)是否可以运行需要2 ^ 20/512个线程的算法?
3)如果我需要的线程数(2 ^ 20/512)大于CUDA可以提供的线程数,会发生什么?它只是填充所有可用线程,然后在完成计算后将这些线程重新分配给其他等待的任务吗?
4)如果我想在每个块中使用最大线程数,应该像<<<number, 512>>>
那样将线程数设置为512,还是可以使用?一个dim3
值?
如果您能对这些^^问题中的任何一个提供任何见解,我将不胜感激。
答案 0 :(得分:1)
- 如何找到实际的最大块数?我不确定引号^^表示“ 65,535(或更大的2 ^ 31-1)”的含义, 因为这些数字显然非常不同。
阅读相关的documentation,或构建并运行devicequery实用程序。但无论哪种情况,限制都远大于2048(2 ^ 20/512等于2048)。另请注意,当前所有受支持的硬件上的块大小限制为每块1024个线程,而不是512个线程,因此您可能需要少至1024个块。
- 是否可以运行需要2 ^ 20/512个线程的算法?
是
- 如果我需要的线程数量大于CUDA可以提供的数量,会发生什么?
什么都没有。发出运行时错误。
- 它只是填充所有可用线程,然后在完成计算后将这些线程重新分配给其他等待的任务吗?
不。您必须自己明确实现这种方案。
- 如果我想在每个块中使用最大线程数,是否应该像
<<<number, 512>>>
那样将线程数设置为512,还是使用dim3值有好处?
没有区别。