Автоматизация ввода-вывода CUDA/Пример передачи динамического массива на хост

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
#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;
}