0

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

4

1 回答 1

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>());
于 2012-03-15T21:51:04.287 回答