Результат CUDA Thrust Min_Element равен 0 - PullRequest
0 голосов
/ 23 апреля 2019

Очень плохо знакомы с CUDA и C ++, однако работали над некоторыми проблемами, которые я заметил.Я хочу создать наименьшее число, а также индекс в CUDA.В настоящее время у меня есть

    __global__ void updateGB2(Particle *dev_p) {
    int i = threadIdx.x + blockIdx.x *blockDim.x;

    globalB[i] = dev_p[i].localBest;

    double *result = thrust::min_element(thrust::device,globalB, globalB + pSize);
    printf("%lf", result);
}

И этот метод вызывается, однако в результате выводится только 0,0000.Возможно, мне не хватает информации для использования тяги, но из информации, которую я прочитал, я не уверен, что еще делать.globalB определяется как устройство , а Particle передается из CPU в GPU.

1 Ответ

1 голос
/ 24 апреля 2019

Цитирование из тяги Документация

min_element находит наименьший элемент в диапазоне [first, last). Это возвращает первый итератор i в [first, last), такой что никакой другой итератор в [first, last) указывает на значение меньше * i.

В вашем коде это означает, что result - это указатель, к которому необходимо обратиться, чтобы получить доступ к минимальному значению. Полный пример:

#include <cstdio>
#include <thrust/device_vector.h>
#include <thrust/extrema.h>
#include <thrust/copy.h>

__global__ void updateGB2(double *data, int pSize) {
    int i = threadIdx.x + blockIdx.x *blockDim.x;

    double* globalB = data + (i * pSize);
    double* result = thrust::min_element(thrust::device, globalB, globalB + pSize);
    printf("%d %lf\n", i, *result);
}

int main() 
{
    const int pSize = 16;
    const int Nvectors = 32;
    const int Nvals = Nvectors * pSize;

    {
        thrust::device_vector<double> dv(Nvals);

        thrust::counting_iterator<double> counter(10);
        thrust::copy(counter, counter+Nvals, dv.begin());

        double* d_h = thrust::raw_pointer_cast(dv.data());
        updateGB2<<<1, Nvectors>>>(d_h, pSize);
        cudaDeviceSynchronize();
    }
    cudaDeviceReset();

    return 0;
}

, который компилируется и работает так:

$ nvcc -arch=sm_52 -o thrustdevice thrustdevice.cu 
$ ./thrustdevice 
0 10.000000
1 26.000000
2 42.000000
3 58.000000
4 74.000000
5 90.000000
6 106.000000
7 122.000000
8 138.000000
9 154.000000
10 170.000000
11 186.000000
12 202.000000
13 218.000000
14 234.000000
15 250.000000
16 266.000000
17 282.000000
18 298.000000
19 314.000000
20 330.000000
21 346.000000
22 362.000000
23 378.000000
24 394.000000
25 410.000000
26 426.000000
27 442.000000
28 458.000000
29 474.000000
30 490.000000
31 506.000000
...