【问题标题】:thrust doesn't provided the expected result using thrust::minimum使用推力::最小推力没有提供预期的结果
【发布时间】:2012-03-15 20:09:39
【问题描述】:

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

【问题讨论】:

    标签: cuda thrust


    【解决方案1】:

    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::minimum与@结合起来987654333@:

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

    【讨论】:

    • 哪种方式更快?我使用了你昨晚写给我的方式,它返回了一个指针(device_ptr)。我必须使用 * 运算符来提取值。
    • 它们的速度应该几乎相同,因为它们都受到读取阵列带宽的限制。
    猜你喜欢
    • 2014-03-12
    • 2017-02-14
    • 2020-07-27
    • 2014-07-01
    • 2019-08-18
    • 2012-09-05
    • 1970-01-01
    • 2014-09-06
    • 2016-02-28
    相关资源
    最近更新 更多