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より小さい」という yes または no の質問に答える関数です。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 に答える