考虑以下代码,当p是指向GPU端的指针时。
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。我在这做错了什么?
答案 0 :(得分:2)
thrust::minimum_element
要求用户提供比较谓词。也就是说,回答“是或否”问题的函数“x
小于y
?”
thrust::minimum
不是谓词;它回答了问题“x
或y
中哪一个较小?”。
要使用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::minimum
与thrust::reduce
:
smallest_value = thrust::reduce(first, last, std::numeric_limits<T>::max(), thrust::minimum<T>());