【问题标题】:Which memory space does cudaMalloc allocate memory in?cudaMalloc 在哪个内存空间分配内存?
【发布时间】:2019-12-27 02:22:26
【问题描述】:

如果我理解正确,CUDA 设备有几个不同的memory spaces。 (例如注册、本地、共享、全局等)。调用cudaMalloc()时,分配的内存驻留在哪个内存空间?

例如:

__global__ mykernel (void *p) {
    /* What memory space does p point to? */
    printf("p: %p\n", p);
}

int main() {
    void *p;
    assert(cudaMalloc (&p, 1024) == CUDA_SUCCESS);
    mykernel<<<1,1024>>> (p);
}

documentation 没有提到分配内存的级别。它只是说

在设备上分配size字节的线性内存并返回一个指向分配内存的指针。分配的内存适合任何类型的变量对齐。内存没有清空。

似乎内存必须驻留在全局/常量/纹理空间之一中,但哪个?

假设内存永远不会在本地/寄存器/共享内存空间中是否也安全?

【问题讨论】:

    标签: c cuda nvidia


    【解决方案1】:

    全球

    cudaMalloc 在全局内存中分配。 全局内存分配的另一种方法是在内核中使用newdelete

    __global__ void myKernel(int N)
    {
         int* a = new int[N]; // not recommended
         delete [] a;
    }
    

    共享

    对于动态共享内存,你使用 sth like

    extern __shared__ int s[];
    

    然后像启动内核一样

    myKernel<<<1,n,n*sizeof(int)>>();
    

    或者只是__shared__ int s[4];(内核内部)用于静态共享内存


    注册

    对于寄存器,您可以考虑 C++ 中的自动分配(仅从语法的角度来看):

    int example = 0;
    int moreExample[4]
    

    主要区别在于,如果您的寄存器内存用完,您将发生寄存器溢出,并且变量可能最终在全局内存中而不是寄存器中。

    【讨论】:

    • 我想确保我理解了最后一部分。我可以将寄存器内存视为每个线程的“堆栈”吗?寄存器和本地内存有什么关系?
    • @user8675309 我的意思是语法。它们就像自动变量。当它们超出范围时它们会死去......
    • 本地不是新工作吗?每个线程都有一个不同的指针。
    • @huseyintugrulbuyukisik "new 和 delete 对设备堆内存进行操作。设备允许以这种方式分配一部分全局(即板载)内存。"stackoverflow.com/questions/14417318/cuda-new-delete。是的,每个线程都有不同的指针。
    • 另一种全局内存分配方法是静态方法,使用__device__装饰器。 (来自主机代码的cudaMalloc() 将被视为动态分配)除了用于内核使用的newdelete,还可以使用malloc()free() 以及cudaMalloc() 进行等效的内核行为和cudaFree()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2012-11-30
    • 1970-01-01
    • 2018-08-16
    • 2011-11-29
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多