Memory 分配全局内存

Memory 分配全局内存,memory,cuda,Memory,Cuda,我有以下在GPU上分配全局内存的代码 __global__ void mallocTest() { char* ptr = (char*)malloc(123); //.... free(ptr); } 每个线程是否会为单独的ptr分配内存? 所以,如果我有两个10个线程的块,那么分配了20个数组(即每个线程分配内存供自己使用)? 我怎样才能只为每个块而不是每个线程分配内存? 如果我有2个块和10个线程,那么只分配2个数组。 这可能吗 如果在compute capabi

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

__global__ void mallocTest()
{
    char* ptr = (char*)malloc(123);
    //....
    free(ptr);
}
每个线程是否会为单独的ptr分配内存?
所以,如果我有两个10个线程的块,那么分配了20个数组(即每个线程分配内存供自己使用)? 我怎样才能只为每个块而不是每个线程分配内存? 如果我有2个块和10个线程,那么只分配2个数组。
这可能吗

如果在compute capability 2.0或2.1设备上执行该代码,则每个线程都将从运行时全局内存堆执行分配。因此,如果您的执行网格有20个线程,您将得到20个分配:每个线程一个


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

我应该提到这一点,但是数组的大小不适合共享内存…因此,让每个块有一个线程使用malloc/new在堆中分配内存,并将分配的地址保存在共享内存中,每个线程都可以读取它。Scatman:如果每个线程都需要分配相同大小的内存,为什么不在主机代码(cudamaloc)中为所有线程分配内存,并将其传递给内核,让每个线程从中访问它们的内存?