CUDA有效使用共享/本地内存?

时间:2013-01-19 23:29:35

标签: memory-management cuda gpu-shared-memory gpu-local-memory

对于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__动态列表数组由第一个线程分配?

我想我可能会让事情变得过于复杂,但我不需要改变每个说法的列表,我试图实现的执行就像这样

  1. 创建列表(仅在GPU上完成)
  2. 从每个列表生成输出(在GPU上完成,每个线程只需要为该线程分配的列表中的信息。)
  3. 修改/交换列表(仍在GPU上完成)
  4. 重复2和3,直到主机上遇到某些中断条件
  5. 提前致谢!

1 个答案:

答案 0 :(得分:1)

  

根据我目前的理解,每个线程都有自己的dlist存储在本地内存中,这是真的吗?

这是正确的。每个线程创建局部变量。它们将存储在寄存器或本地存储器中,其中变量的结束主要取决于编译器。

  

如果是这种情况,在内核执行结束时是否有任何方法可以获取每个dlist对象(来自另一个内核),或者我应该使用分配的__shared__动态列表数组由第一个线程?

本地内存对于线程是私有的(例外:从计算能力3.0开始,有一些intrawarp指令可以促进warp中线程之间的线程局部变量的交换)所以你需要将局部变量复制到一些全局内存变量,如果你需要在内核之外获取它的值。 每个线程块分配__shared__内存,并且只能在该线程块中访问,因此您需要将该值复制到全局内存位置。

您可能需要的是像全局列表数组,您可以将其作为参数传递给内核。

相关问题