0

当谈到 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,直到在主机上满足某些中断条件

提前致谢!

4

1 回答 1

1

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

那是对的。局部变量是按线程创建的。它们将存储在寄存器或本地内存中,其中变量结束主要取决于编译器。

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

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

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

于 2013-01-20T00:27:22.310 回答