N0
元素。m
元素进行操作。TBP
个线程。BPG < 65535 =: BPG_max
现在,让我们缩小规模,并考虑使用N0 = 90
的{{1}}元素数组。
TBP = 32
,这意味着3 blocks of 32 threads each looping once (m = 1)
元素可以被操作 - 即浪费6 。3 x 32 x 1 = 96
,这意味着2 blocks of 32 with m = 2
元素可以被操作,这是浪费的38 。对于大型阵列(100MB +)和大量循环(10,000+),因素会变得更大,因此浪费会变得非常大,所以如何最大限度地减少浪费?也就是说,我想要一个优化程序(其中2 x 32 x 2 = 128
表示已完成的实际工作):
答案 0 :(得分:2)
我不会担心“浪费”的线程 - GPU线程很轻。
您可能实际上想要增加块大小,因为这可能会增加GPU的占用率。请注意,SMX(在GeForce 6xx系列中)只能执行16个并发块。使块更大可以让您安排更多线程来隐藏内存访问延迟。
答案 1 :(得分:0)
这实际上是一个非常复杂的问题,我怀疑它有一个O(1)解决方案。 但我猜你可以在CPU上花费一些线性时间来计算最小值。
答案 2 :(得分:0)
根据您在内核中所做的一切,答案可能会或可能不会像您引用的优化问题一样简单。例如。如果您要遇到延迟问题,线程等待彼此完成等等,那么还有更多问题需要考虑。
这site有一些很好的启发式方法。一些一般亮点:
每格选择块
__syncthreads()
的使用越多,块越多(一个块可以运行而另一个块等待同步)每个块选择线程
以经线大小的倍数(即一般为32)的线程
通常可以选择线程数,这样每个块的最大线程数(基于硬件)是线程数的倍数。例如。最大线程数为768,每块使用256个线程往往优于512,因为多个线程可以在块上同时运行。
考虑一下你的线程是否会分享内存,如果是,你想分享多少内存。