对于CUDA中的共享/本地内存,我仍然有点不确定。目前我有一个内核,在内核中每个线程分配一个列表对象。像这样的东西
__global__ void TestDynamicListPerThread()
{
//Creates a dynamic list (Each thread gets its own list)
DynamicList<int> dlist(15);
//Display some ouput information
printf("Allocated a new DynamicList, size=%d, got pointer %p\n", dlist.GetSizeInBytes(),dlist.GetDataPtr());
//Loops through and inserts multiples of four into the list
for (int i = 0; i < 12; i++)
dlist.InsertAtEnd(i*4);
}
根据我目前的理解,每个线程都有自己的dlist
存储在本地内存中,这是真的吗?
如果是这种情况,在内核执行结束时是否有任何方法可以获取每个dlist
对象(来自另一个内核),或者我应该使用__shared__
动态列表数组由第一个线程分配?
我想我可能会让事情变得过于复杂,但我不需要改变每个说法的列表,我试图实现的执行就像这样
提前致谢!
答案 0 :(得分:1)
根据我目前的理解,每个线程都有自己的dlist存储在本地内存中,这是真的吗?
这是正确的。每个线程创建局部变量。它们将存储在寄存器或本地存储器中,其中变量的结束主要取决于编译器。
如果是这种情况,在内核执行结束时是否有任何方法可以获取每个dlist对象(来自另一个内核),或者我应该使用分配的
__shared__
动态列表数组由第一个线程?
本地内存对于线程是私有的(例外:从计算能力3.0开始,有一些intrawarp指令可以促进warp中线程之间的线程局部变量的交换)所以你需要将局部变量复制到一些全局内存变量,如果你需要在内核之外获取它的值。
每个线程块分配__shared__
内存,并且只能在该线程块中访问,因此您需要将该值复制到全局内存位置。
您可能需要的是像全局列表数组,您可以将其作为参数传递给内核。