2012-03-15 3 views
0

을 사용하여 예상 결과를 제공하지 않습니다. p가 GPU 측에 할당 된 포인터 인 경우 다음 코드를 고려하십시오.추력은 : thrust :: minimum

thrust::device_ptr<float> pWrapper(p); 
thrust::device_ptr<float> fDevPos = thrust::min_element(pWrapper, pWrapper + MAXX * MAXY, thrust::minimum<float>()); 
fRes = *fDevPos; 
*fDicVal = fRes; 

CPU 측에서 같은 것을 적용한 후.

float *hVec = new float[MAXX * MAXY]; 
    cudaMemcpy(hVec, p, MAXX*MAXY*sizeof(float), cudaMemcpyDeviceToHost); 

    float min = 999; 
    int index = -1; 
    for(int i = 0 ; i < MAXX* MAXY; i++) 
    { 
     if(min > hVec[i]) 
     { 
      min = hVec[i]; 
      index = i; 
     } 
    } 
    printf("index :%d a wrapper : %f, as vectorDevice : %f\n",index, fRes, min); 
     delete hVec; 

나는 min! = fRes를 얻습니다. 여기서 내가 뭘 잘못하고 있니?

답변

2

thrust::minimum_element은 비교 술어를 입력해야합니다. 즉, 예 또는 아니오 질문에 응답하는 함수는 "은 y보다 작습니까?"

thrust::minimum은 술어가 아닙니다. "x 또는 y 중 어느 것이 더 작습니까?"라는 질문에 대답합니다.

minimum_element를 사용하여 최소의 요소를 찾으려면 thrust::less 조건을 통과 :

ptr_to_smallest_value = thrust::min_element(first, last, thrust::less<T>()); 

또는 아무것도 전달하지 않습니다.

: 관심있는 모두가 값이 가장 작은 요소 (안 작은 요소를 가리키는 반복자), 당신은 thrust::reducethrust::minimum을 결합 할 수의 인 경우

ptr_to_smallest_value = thrust::min_element(first, last); 

: thrust::less은 기본입니다

smallest_value = thrust::reduce(first, last, std::numeric_limits<T>::max(), thrust::minimum<T>()); 
+0

어떤 방식으로 더 빠릅니까? 나는 어젯밤에 당신이 저에게 쓴 방법을 사용했고 그것은 포인터 (device_ptr)를 돌려주었습니다. 여기에서 * 연산자를 사용하여 값을 추출해야했습니다. –

+0

그들은 배열을 읽는 대역폭에 따라 제한되는 것과 거의 같은 속도 여야합니다. –