繁体   English   中英

全局内核中的CUDA变量

[英]CUDA variables inside global kernel

我的问题是:

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内存上发生,对于声明的任何变量,您在gpu上就需要N倍的内存,其中N是线程数。

3)在我当前的程序中,我有35 * 48 = 1680个块,每个块包含32 * 32 = 1024个线程。 这是否意味着,在全局内核中声明的任何变量将比在内核之外花费N = 1024 * 1680 = 1 720 320倍?

4)要使用共享内存,每个变量需要的内存比平时多M倍。 这里M是数。 真的吗?

1)是的。 每个线程都有一个在函数中声明的非共享变量的私有副本。 这些通常会进入GPU register存储器,尽管会溢出到local存储器中。

2)3)4)虽然确实需要该私有内存的许多副本,但这并不意味着您的GPU必须为每个线程一次拥有足够的私有内存。 这是因为在硬件中,并非所有线程都需要同时执行。 例如,如果您启动N个线程,则可能是一半在给定的时间处于活动状态,而另一半在没有可用资源运行它们之前不会启动。

线程使用的资源越多,硬件可以同时运行的资源越少,但这并不限制您可以请求运行的资源数量,因为一旦释放了一些资源,GPU所没有的任何线程都将运行。

这并不意味着您应该发疯并声明大量的本地资源。 GPU之所以快速,是因为它能够并行运行线程。 要并行运行这些线程,需要在任何给定时间容纳很多线程。 从一般意义上讲,每个线程使用的资源越多,给定时刻处于活动状态的线程就越少,硬件可以利用的并行性就越少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM