Вектор устройства CUDA - PullRequest
       39

Вектор устройства CUDA

0 голосов
/ 28 апреля 2020

Я хочу отправить вектор в мое ядро. У меня есть вектор с плавающей точкой h_vec.

thrust::device_vector<float> d_vec = h_vec;
float* pd_vec = thrust::raw_pointer_cast(d_vec.data());
...
kernel<<<grid, block>>>(pd_vec)

Однако в моем ядре вектор кажется заполненным нулями, и я понятия не имею, почему.

__global__ void kernel (float* pd_vec)

Требуется ли, чтобы Я специально выделяю память для этого вектора в хосте с cudaMalloc и cudaMemcpy?

1 Ответ

2 голосов
/ 28 апреля 2020

Требуется ли специально выделять память для этого вектора в хосте с помощью cudaMallo c и cudaMemcpy?

Нет. Назначение копирования прекрасно работает между контейнерами тяги (хостом или устройством) и std::vector.

Например:

$ module load cuda/10.1

$ cat notreallyno.cu 

#include <thrust/device_vector.h>
#include <vector>
#include <cstdio>

__global__ void kernel (float* pd_vec, int n)
{
    if (threadIdx.x < n)
        printf("%d %f \n", threadIdx.x, pd_vec[threadIdx.x]);
}

int main()
{
    {
    std::vector<float> h_vec = { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.01f };
    thrust::device_vector<float> d_vec = h_vec;
    float* pd_vec = thrust::raw_pointer_cast(d_vec.data());

    int n = h_vec.size();
    kernel<<<1, 32>>>(pd_vec, n);
    cudaDeviceSynchronize();
    }
    cudaDeviceReset();

    return 0;
}

$ nvcc -std=c++11 -arch=sm_52 -o notreallyno notreallyno.cu 

$ ./notreallyno 
0 1.100000 
1 2.200000 
2 3.300000 
3 4.400000 
4 5.500000 
5 6.600000 
6 7.700000 
7 8.800000 
8 9.900000 
9 10.010000 
...