Thrust не обеспечивает ожидаемый результат с использованием Thrust :: минимум - PullRequest
0 голосов
/ 16 марта 2012

рассмотрим следующий код, когда 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;

после применения того же самого на стороне процессора.

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;

я получаю это min! = FRes.что я тут не так делаю?

1 Ответ

2 голосов
/ 16 марта 2012

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>());
...