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

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

struct Vector 
{
	size_t cData;
	int* data;
};

__device__ void fill(int* x, size_t n)
{
	for (int i = 0; i < n; i++)
		x[i] = 5 + i;
}

__global__ void generateVector(Vector *input, size_t* imax)
{
	*imax = 5;
	int *p = new int[*imax];
	fill(p, *imax);
	input->data = p;
}

__global__ void getVectorData(Vector *input, int* output, size_t* imax)
{
	*imax = 5;

	for (auto i = 0; i < *imax; i++) 
	{
		output[i] = input->data[i];
	}
	*imax = 5;
}

int main(void)
{
	size_t* size = 0;
	Vector * _s;
	int* _f, *f;
	int count = 5;

	cudaError_t err = cudaMalloc((void **)&size, sizeof(size_t));
	if (err != cudaSuccess) 
	{
        fprintf(stderr, "cudaMalloc failed!");
    }
	err = cudaMalloc((void **)&_s, sizeof(Vector));
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMalloc failed!");
	}
	size_t sz = sizeof(int) * count;
	err = cudaMalloc((void **)&_f, sz);
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMalloc failed!");
	}
	f = new int[count];

	generateVector << <1, 1 >> > (_s, size);
	cudaPeekAtLastError();

	Vector * pHost;
	size_t host_size;
	pHost = new Vector;

	err = cudaMemcpy(pHost, _s, sizeof(Vector), cudaMemcpyDeviceToHost);
	if (err != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy failed!");
	}

	getVectorData << <1, 1 >> > (_s, _f, size);
	cudaPeekAtLastError();
	err = cudaMemcpy(f, _f, sz, cudaMemcpyDeviceToHost);
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
	}
	cudaDeviceReset();

	for (int i = 0; i < count; i++) {
		fprintf(stdout, "%d %d\n", i, f[i]);
	}

	return 0;
}