2011-11-06 3 views
1

간단한 질문이 있습니다. 예를 들어 추력 벡터에서 작성한 cuda 커널을 사용하려면 device_vector를 일반 포인터 유형으로 변환해야합니까? 아니면 다른 방법이 있습니까?추력 벡터 유형에 대한 일반 CUDA 커널 만들기

오, 또 다른 것은, device_vector constructur에 관해서는, GPU에 할당 된 포인터가 있다면, 그 포인터를 받아들이는 빠른 device_vector가 있거나, CPU에 우선적으로 모든 것을 전송하고 나서 내 device_vector에 적절한 인수 (CPU 할당 변수)가 있습니까?

감사합니다. igal!

답변

1

나는 추력 벡터에 작성한 커다 커널을 사용하고 싶습니다. device_vector를 일반 포인터 유형으로 변환해야합니까?

  1. 당신은 펑터 및 일반 알고리즘을 사용할 수 있습니다

당신은 두 가지 옵션이 있습니다. 세부 사항 in manual (pp 18-22). (manual P. 11) 가 아닌 표준 알고리즘이있는 경우 또한 조언은 가까운 zip_iterator

  • 에보고 할 수 있습니다 또는 당신이있어 이미 커널, 다음은 raw_pointer에 벡터를 캐스팅하는 것이 더 간단 할 것이 내가 GPU에 할당 된 포인터가있는 경우

    , 당신은 클래스 device_ptr에 포인터를 래핑 할 수의 standart 알고리즘을 사용하려면 그 포인터

    을 받아 빠른 device_vector이있다. 그런 다음 device_vector와 동일한 객체를 사용할 수 있습니다.

    int N = 10; 
    // raw pointer to device memory 
    int * raw_ptr; 
    cudaMalloc((void **) &raw_ptr, N * sizeof(int)); 
    // wrap raw pointer with a device_ptr 
    thrust::device_ptr<int> dev_ptr(raw_ptr); // use device_ptr in thrust algorithms 
    thrust::fill(dev_ptr, dev_ptr + N, (int) 0); // access device memory through device_ptr 
    dev_ptr[0] = 1; 
    // free memory 
    cudaFree(raw_ptr); 
    

    코드 manual p. 12.