Cuda 推力不';t使用推力::最小值提供预期结果

Cuda 推力不';t使用推力::最小值提供预期结果,cuda,thrust,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; 推力:装置ptr压水堆振打器(p); 推

考虑以下代码,当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;
推力:装置ptr压水堆振打器(p); 推力:装置推力:最小推力(pWrapper,pWrapper+MAXX*MAXY,推力:最小推力()); fRes=*fDevPos; *fDicVal=湿壁画; 在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;
float*hVec=newfloat[MAXX*MAXY];
cudaMemcpy(hVec,p,MAXX*MAXY*sizeof(浮点),cudaMemcpyDeviceToHost);
浮动最小值=999;
int指数=-1;
对于(int i=0;ihVec[i])
{
min=hVec[i];
指数=i;
}
}
printf(“索引:%d包装器:%f,作为向量设备:%f\n”,索引,fRes,min);
删除hVec;

我明白了弗雷斯。我做错了什么?

推力::最小\u元素
要求用户提供一个比较谓词。也就是说,回答是或否问题的函数“是
x
小于
y
?”

struch::minimum
不是谓词;它回答了以下问题:“x或y中哪个更小?”

要使用
minimum_element
查找最小元素,请传递
推力::less
谓词:

ptr_to_smallest_value = thrust::min_element(first, last, thrust::less<T>());
如果您感兴趣的只是最小元素的值(而不是指向最小元素的迭代器),则可以将
stress::minimum
stress::reduce
组合使用:

smallest_value = thrust::reduce(first, last, std::numeric_limits<T>::max(), thrust::minimum<T>());
最小_值=推力::减小(第一,最后,标准::数值_限制::最大(),推力::最小());

哪种方式更快?我使用了你昨晚写给我的方式,它返回了一个指针(device_ptr)。我必须使用*运算符来提取值。它们的速度应该几乎相同,因为它们都受到读取数组带宽的限制。
smallest_value = thrust::reduce(first, last, std::numeric_limits<T>::max(), thrust::minimum<T>());