Memory Cuda、统一内存、数据传输

Memory Cuda、统一内存、数据传输,memory,cuda,Memory,Cuda,当内核启动时,cuda是否会以某种方式阻止所有分配的托管内存并将其传输到GPU?我只是和乌玛一起玩,结果很奇怪。至少在我看来是这样 我创建了2个数组并将A发送到内核,内核调用未触及B,但无法访问它。当我触摸B时,程序就崩溃了 0此处0 0 1 如果我注释掉b[0]=1行代码运行正常: 0 0 0此处1后1 0此处2 1后2 为什么会这样 __global__ void kernel(int* t) { t[0]++; } int main() { int* a; i

当内核启动时,cuda是否会以某种方式阻止所有分配的托管内存并将其传输到GPU?我只是和乌玛一起玩,结果很奇怪。至少在我看来是这样

我创建了2个数组并将A发送到内核,内核调用未触及B,但无法访问它。当我触摸B时,程序就崩溃了

0此处0 0 1

如果我注释掉
b[0]=1行代码运行正常:

0 0 0此处1后1 0此处2 1后2

为什么会这样

__global__ void kernel(int* t)
{
    t[0]++;

}


int main()
{
    int* a;
    int* b;


    std::cout << cudaMallocManaged(&a,sizeof(int)*100) << std::endl;
    std::cout << cudaMallocManaged(&b,sizeof(int)*100) << std::endl;

    std::cout << b[0] << std::endl;

    kernel<<<1,1,0,0>>>(a);

    std::cout << "here1" << std::endl;
    b[0] = 1;
    std::cout << "after1" << std::endl;

    cudaDeviceSynchronize();


    std::cout << b[0] << std::endl;

    std::cout << "here2" << std::endl;
    std::cout << a[0] << std::endl;
    std::cout << "after2" << std::endl;




    return 0;
}
\uuuuu全局\uuuuu无效内核(int*t)
{
t[0]++;
}
int main()
{
int*a;
int*b;
标准::cout
cuda是否以某种方式阻止并将所有分配的托管内存传输到
内核启动时的GPU

可以,前提是您的设备的计算能力低于6.0

在这些设备上,托管内存的工作原理是在内核启动之前将所有托管内存复制到GPU,并在同步时将所有托管内存复制回主机。在这段时间内,从主机访问托管内存

您可以更具体地为给定内核复制哪个内存,方法是将内核启动到该流中