【问题标题】:Allocating global memory分配全局内存
【发布时间】:2012-03-22 13:27:25
【问题描述】:

我有以下代码在 GPU 上分配全局内存。

__global__ void mallocTest()
{
    char* ptr = (char*)malloc(123);
    //....
    free(ptr);
}

每个线程都会为单独的指针分配内存吗?
所以如果我有2个10个线程的块,那么分配20个数组(即每个线程分配内存供自己使用)? 我怎样才能只分配每个块而不是每个线程的内存? 即,如果我有 2 个块和 10 个线程,则只分配 2 个数组。 这可能吗?

【问题讨论】:

    标签: memory cuda


    【解决方案1】:

    如果您在计算能力为 2.0 或 2.1 的设备上执行该代码,每个线程都会从运行时全局内存堆中执行分配。因此,如果您的执行网格有 20 个线程,您将获得 20 个分配:每个线程一个。

    如果您希望每个块都有一个数组(并且您希望块中的每个线程访问同一个数组),那么逻辑方法是使用共享内存,特别是如果内存仅用于块的生命周期并且不打算再次使用。

    【讨论】:

    • 我应该提到这一点,但是数组的大小不适合共享内存...
    • 然后让每个块有一个线程使用 malloc/new 分配堆中的内存,并将分配的 地址 保存在每个线程可以读取的共享内存中。然后块中的每个线程都可以使用内存。
    • Scatman:如果每个线程都需要分配相同大小的内存,为什么不在主机代码(cudaMalloc)中为所有线程分配,将它传递给内核并让每个线程访问它们的内存块从那?
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 2012-08-12
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多