[cuda]unified memory测试

unified memory 在被 kernel 函数访问的时候,如果同事被 host 函数访问,那么host 得到的结果可能是错误的,测试程序如下

#include 
#include 

__global__ void umem_test(int* cnt){
    atomicAdd(cnt,1);
}

int main(){
    int *cnt;
    assert(cudaMallocManaged(&cnt,sizeof(*cnt))==cudaSuccess);
    for(int i=0;i<1000;++i){
        *cnt = 0;
        umem_test<<<128,128>>>(cnt);
        assert(*cnt==128*128);
    }
    return 0;
}

unified memory,如果此时正被kernel使用,那么在host访问时并不触发cudaMemcpy
把上述程序改成一下形式,结果是正确的

#include 
#include 

__global__ void umem_test(int* cnt){
    atomicAdd(cnt,1);
}

int main(){
    int *cnt;
    assert(cudaMallocManaged(&cnt,sizeof(*cnt))==cudaSuccess);
    for(int i=0;i<1000;++i){
        *cnt = 0;
        umem_test<<<128,128>>>(cnt);
        int resutl;
        cudaMemcpy(&resutl,cnt,sizeof(resutl),cudaMemcpyDeviceToHost);
        assert(*cnt==128*128);
    }
    return 0;
}

新插入的cudaMemcpyumem_test都是在默认的stream上执行的,而且cudaMemcpy是同步操作,所以必须等待umem_test执行完成才能执行,此时访问*cnt时,umem_test已经完成,所示此时能够得到正确结果

你可能感兴趣的:(c/c++,Linux,cuda)