2012-03-15 53 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