2012-03-15 57 views
0

考慮下面的代碼,當p是分配GPU端的指針時。推力沒有提供使用推力的預期結果:: 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; 

我明白了!= fRes。我在這裏做錯了什麼?

回答

2

thrust::minimum_element要求用戶提供比較謂詞。也就是說,回答是或否問題的函數是x小於y?「

thrust::minimum不是謂詞;它回答了「xy哪個更小?」的問題。

要找到使用minimum_element最小的元素,通過thrust::less斷言:

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

另外,不通過任何東西。 thrust::less是默認:

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

如果所有你感興趣的是值最小的元素(不是迭代指着最小的元素),你可以用thrust::reduce結合thrust::minimum

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

哪種方式更快?我用你昨天晚上寫給我的方式,它返回一個指針(device_ptr)。我不得不使用*運算符來提取值。 – 2012-03-16 07:16:01

+0

它們的速度應該幾乎相同,因爲它們都受讀取陣列帶寬的限制。 – 2012-03-16 18:44:31