2014-06-04 5 views
0

나는 추력을보고있다 그리고 나는 거의 (그러나 확실히)이 내 대답 질문에 발견 :이 질문에 대해 답이 게시 Finding the maximum element value AND its position using CUDA Thrust지수는

예는 잘 작동하지만, 어떻게 원시 포인터를 사용하여 동일한 작업을 수행 할 수 있습니까? 우리가 내가 올바른 생각하는이 코드를 가정 해 봅시다 (커널 구성을 무시, 그것은 편의상의) :

float* d_A; 
const unsigned int noElems = 10; 
cudaMalloc(&d_A, noElems * sizeof(float)); 
initDeviceVector<<<1, noElems>>>(d_A); 

thrust::device_ptr<float> d_ptr = thrust::device_pointer_cast(d_A);  
thrust::device_vector<float>::iterator iter = 
    thrust::max_element(d_ptr, d_ptr + noElems); 

는 꽤 원시 포인터 ITER 를 사용하여 위치를 추출하는 방법을 알아낼 수 없습니다.

감사합니다.

+0

힌트 :

다음 완전히 일 예는이 보여 포인터는 임의 접근 반복자입니다. –

+0

사실, 나는 내가해야 할 일을 이해하고 있다고 생각합니다. (단지 d_ptr에서 iter를 뺍니다), 추측 할 수없는 것은 추력에서 그것을하는 방법입니다. 분명히 iter - d_ptr은 다른 데이터 유형 때문에 간단히 작동하지 않습니다. 예를 들어, iter와 d_ptr 둘 다에서 정수 값을 얻는 방법이 있습니까? 나는 문서를 확인하고 거기에서 정보를 추출 할 수 없었다. – Intri

+0

질문을 올바르게 이해했다면 다음 두 가지 작업이 필요합니다. 1) 원시 포인터로'max_element'를 제공 할 수 있도록 원시 포인터를'device_ptr'로 변환하십시오. 2) 이후에 최대 요소 값을 가리킬 수 있도록 반복기를 포인터로 변환하십시오. 이 두 개의 게시물이 도움이 될 것입니다 : [추력 :: 반복자를 원시 포인터로 변환] (http://stackoverflow.com/questions/12201446/converting-thrustiterators-to-and-from-raw-pointers) 및 [변환 원시 포인터에 STL 벡터 반복자] (http://artins.org/ben/software/converting-an-stl-vector-iterator-to-a-raw-pointer). – JackOLantern

답변

2

아마 여러 가지 방법이 있습니다. 코드에서 직접 작업하는 경우 먼저 적절한 장치 포인터로 변환하면 iter의 값을 device_ptr과 비교할 수 있습니다.

$ cat t436.cu 
#include <thrust/device_vector.h> 
#include <thrust/host_vector.h> 
#include <thrust/extrema.h> 
#include <stdio.h> 


__global__ void initDeviceVector(float *data){ 
    int idx = threadIdx.x+blockDim.x*blockIdx.x; 
    data[idx] = idx%7; 
} 

    int main(){ 

    float* d_A; 
    const unsigned int noElems = 10; 
    cudaMalloc(&d_A, noElems * sizeof(float)); 
    initDeviceVector<<<1, noElems>>>(d_A); 

    thrust::device_ptr<float> d_ptr = thrust::device_pointer_cast(d_A); 
    thrust::device_vector<float>::iterator iter = thrust::max_element(d_ptr, d_ptr + noElems); 

    int pos = thrust::device_pointer_cast(&(iter[0])) - d_ptr; 

    printf("pos = %d\n", pos); 
    return 0; 
} 

$ nvcc -arch=sm_20 -o t436 t436.cu 
$ ./t436 
pos = 6 
$ 
+0

감사합니다. 하나 더 작은 질문, 만약 내가 할 수 있습니다 : 내 실험에서, 나는 직접 max_element 함수의 결과를 thrust :: device_ptr 에 저장하고 잘 작동하는 것 같다. 추력은 암시 적으로 포인터 캐스팅을 수행합니까? – Intri

+0

네, 그렇습니다. 그렇게하면 코드가 상당히 단순 해집니다. –