2013-01-21 3 views
0

저는 CUDA를 처음 사용하고 있으며 사용법을 배우려고합니다. 누군가 도와 주실 수 있습니까? 내가 메인 함수에 다음과 같은 한 (내가 비주얼 스튜디오에서 오전 내 소스와 헤더 파일은 .CU을하고 각각 .cuh)thrust :: device_vector in CUDA

thrust::device_vector<float> d_vec(100); 
kernel<<<100,1>>>(d_vec); 

다음 커널에 내가 가지고

template <typename T> __global__ kernel(thrust::device_vector<T> d_vec) 
    { int tid = threadIdx.x + blockIdx.x*blockDim.x; 
     T xxx = 3.0; 
     d_vec[tid] = xxx; 
    } 

내 목표는 float로 커널을 한 번, double로 한 번 호출하는 것입니다. 또한이 간단한 예제에서는 변수 xxx (실제 사례에서는 이중 또는 부동 소수점 숫자를 생성하는 일부 계산)가 있음에 유의하십시오.

내가 얻을 개의 오류 : 1>을 __global__ 함수로부터 __host__ 함수 (연산자 =)을 호출하는 것은 허용되지 않는 __global__ 함수로부터 __host__ 함수 (연산자 [])를 호출> 2 허용되지

그래서 "d_vec [tid] = .."의 "[]"및 "="문제가 있습니다. 하지만 내 질문은 어떻게 내 커널 내부 장치 벡터에 액세스 할 수 있습니다. 어떤 사람이 올바른 절차와 내가 뭘 잘못하고 있는지 명확히 해 주실 수 있습니까? 미리 감사드립니다.

+0

나는 또한 아마 내가 잘하지 못하는 것을하고 있음을 깨달았다. 내 벡터가 60000 요소라고 말하는 것은 아주 큽니다. 이상적으로 나는 60000 커널을 생성하고 각 커널 계산의 결과를 벡터의 적절한 인덱스에 복사하려고합니다. 하지만 60000 벡터를 각각 60000 벡터로 생성하고 싶지 않습니다. (잘하면이 코드는 내 코드에서 발생하지 않습니다.) – user1612986

답변

3

thrust :: device_vector 객체/참조를 커널 매개 변수로 사용할 수 없습니다. 원시 포인터를 사용하여 장치 벡터 데이터를 전달할 수 있습니다.

thrust::device_vector<float> d_vec(100); 
float* pd_vec = thrust::raw_pointer_cast(d_vec.data()); 
kernel<<<100,1>>>(pd_vec); 

여기가

template <typename T> __global__ kernel(T* pd_vec) 

당신 Q이 하나와 유사한 커널의 프로토 타입입니다. how to cast thrust::device_vector<int> to raw pointer

관련 문제