Автоматизация ввода-вывода CUDA/Пример передачи динамического массива на хост
Перейти к навигации
Перейти к поиску
#include "cuda_runtime.h"
#include "cuda_runtime_api.h"
#include <iostream>
#include <cstring>
__device__ void fill(int* x, std::size_t n)
{
for (int i = 0; i < n; i++)
x[i] = i + 10;
}
__global__ void getVectorData(int** dev_data, int* output, std::size_t* dev_size)
{
memcpy(output, *dev_data, *dev_size * sizeof(int));
}
__global__ void generateVector(int** dev_data, std::size_t* dev_size)
{
int* vec = new int[5];
*dev_size = 5;
fill(vec, *dev_size);
*dev_data = vec;
}
__global__ void freeMemory(int** pData)
{
delete [] *pData;
}
int main(void)
{
int* host_data, **dev_data, *host_dev_data;
std::size_t* dev_size, host_size;
cudaError_t err = cudaMalloc((void **)&dev_size, sizeof(std::size_t));
if (err != cudaSuccess)
fprintf(stderr, "cudaMalloc of dev_vector failed!");
err = cudaMalloc((void **)&dev_data, sizeof(int*));
if (err != cudaSuccess)
fprintf(stderr, "cudaMalloc of dev_vector failed!");
generateVector << <1, 1 >> > (dev_data, dev_size);
err = cudaMemcpy(&host_size, dev_size, sizeof(std::size_t), cudaMemcpyDeviceToHost);
if (err != cudaSuccess)
fprintf(stderr, "cudaMemcpy failed!");
err = cudaMalloc((void **)&host_dev_data, sizeof(int) * host_size);
if (err != cudaSuccess)
fprintf(stderr, "cudaMalloc of dev_vector failed!");
getVectorData<<<1,1>>>(dev_data, host_dev_data, dev_size);
host_data = new int[host_size];
err = cudaMemcpy(host_data, host_dev_data, sizeof(int) * host_size, cudaMemcpyDeviceToHost);
if (err != cudaSuccess)
fprintf(stderr, "cudaMemcpy failed!");
freeMemory<<<1,1>>>(dev_data);
cudaFree(dev_data);
cudaFree(host_dev_data);
return 0;
}