Cudamaloc在哪个内存空间分配内存?

Cudamaloc在哪个内存空间分配内存?,c,cuda,nvidia,C,Cuda,Nvidia,如果我理解正确,CUDA设备有一些不同的功能。(例如,注册、本地、共享、全局等)。调用cudamaloc()时,分配的内存驻留在哪个内存空间 例如: __global__ mykernel (void *p) { /* What memory space does p point to? */ printf("p: %p\n", p); } int main() { void *p; assert(cudaMalloc (&p, 1024) == CUD

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

例如:

__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);
}
\uuuuu全局\uuuuuumykernel(void*p){
/*p指向什么内存空间*/
printf(“p:%p\n”,p);
}
int main(){
void*p;
断言(cudamaloc(&p,1024)=CUDA_SUCCESS);
mykernel(p);
}
没有提到在什么级别分配内存。它只说

在设备上分配
size
字节的线性内存,并返回指向已分配内存的指针。为任何类型的变量适当地对齐分配的内存。内存未被清除

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


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

global

cudamaloc
在全局内存中分配。 全局内存分配的另一种方法是在内核内部使用
new
delete

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

共享

对于动态共享内存,您可以使用

extern __shared__ int s[];
然后像内核一样启动

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

主要区别在于,如果寄存器内存不足,则会导致寄存器溢出,变量可能会最终进入全局内存而不是寄存器。

我想确保我理解最后一部分。我能把寄存器内存看作每个线程的“堆栈”吗?寄存器和本地内存有什么关系?@user8675309我是说语法。它们就像自动变量。当它们超出范围时就会死亡……这不是本地的新工作吗?每个线程都会得到一个不同的指针。@huseyintugrulbuyukisik“新建和删除操作在设备堆内存上。设备允许以这种方式分配一部分全局(即板载)内存。”。是的,每个线程都有不同的指针。全局内存分配的另一种方法是静态方法,使用
\uuuu设备\uuu
装饰器。(主机代码中的
cudamaloc()
将被视为动态分配)除了内核内使用的
new
delete
之外,
malloc()
free()
还可以使用
cudaMalloc()
cudaFree()
实现内核内的等效行为。
int example = 0;
int moreExample[4]