推力没有提供使用推力::最小值的预期结果

时间:2012-03-15 20:09:40

标签: cuda thrust

考虑以下代码,当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。我在这做错了什么?

1 个答案:

答案 0 :(得分: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::minimumthrust::reduce

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