2017-01-31 2 views
1

cuda는 커널이 시작될 때 할당 된 모든 관리 대상 메모리를 차단하고 GPU로 전송합니까? 나는 방금 uma와 놀았고 이상한 결과를 얻었다. 적어도 내 관점에서.Cuda, 통합 메모리, 데이터 전송

2 개의 어레이를 만들고 커널에 A를 보내면 B는 커널 호출에 영향을받지 않지만 액세스 할 수는 없습니다.

0 0 0 here1 0 here2 after1 :이 프로그램은 그냥 내가 b[0] = 1; 줄을 주석으로 경우 코드가 잘 실행 B.

0 0 0 here1

을 터치하면 충돌 1 after2

왜 이런 일이 발생합니까?

__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; 
} 

답변

2

는 CUDA 어떻게 든 차단하고 커널을 시작할 때 에 GPU를 할당 된 모든 관리되는 메모리를 전송합니까?

예, 사용 가능한 장치의 처리 능력이 6.0 미만입니다.

이러한 장치에서 관리되는 메모리는 커널 시작 전에 모든 관리되는 메모리를 GPU에 복사하고 동기화 할 때 모든 관리되는 메모리를 호스트에 다시 복사하여 작동합니다. 해당 시간 동안 호스트 will lead to a segmentation fault에서 관리되는 메모리에 액세스합니다.

주어진 커널에 복사 할 메모리를 attaching it to a stream using cudaStreamAttachMemAsync()으로 지정하고 해당 스트림으로 커널을 시작하는 것이 더 구체적 일 수 있습니다.