我的问题是:
1)我的理解是否正确,当您在全局内核中声明一个变量时,每个线程都会有该变量的不同副本。这允许您为每个线程在该变量中存储一些中间结果。示例:向量 c=a+b:
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = threadIdx.x;
int p;
p = a[i] + b[i];
c[i] = p;
}
这里我们声明中间变量p。但实际上这个变量有 N 个副本,每个副本对应一个线程。
2)如果我声明数组,则会创建该数组的 N 个副本,每个副本对应每个线程,这是真的吗?只要全局内核中的所有内容都发生在 GPU 内存上,对于声明的任何变量,您都需要 N 倍的 GPU 内存,其中 N 是线程数。
3)在我当前的程序中,我有35 * 48 = 1680个块,每个块包括32 * 32 = 1024个线程。这是否意味着,在全局内核中声明的任何变量都会比在内核外声明的变量花费 N=1024*1680=1 720 320 倍?
4)要使用共享内存,每个变量需要比平常多M倍的内存。这里M是数量blocks。真的吗?
1)是的。每个线程都有一个在函数中声明的非共享变量的私有副本。这些通常进入 GPUregister
内存,虽然可以溢出到local
memory.
2), 3) and 4)虽然您确实需要该私有内存的许多副本,但这并不意味着您的 GPU 必须同时为每个线程提供足够的私有内存。这是因为在硬件中,并非所有线程都需要同时执行。例如,如果您启动 N 个线程,则可能有一半在给定时间处于活动状态,而另一半在有可用资源运行它们之前不会启动。
线程使用的资源越多,硬件可以同时运行的资源就越少,但这并不限制您可以要求运行的线程数量,因为一旦释放了一些资源,GPU 没有资源的任何线程都将运行。
这并不意味着您应该疯狂地声明大量本地资源。 GPU 速度很快,因为它能够并行运行线程。要并行运行这些线程,需要在任何给定时间容纳大量线程。从一般意义上讲,每个线程使用的资源越多,给定时刻处于活动状态的线程就越少,硬件可以利用的并行性就越少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)