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

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

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

__device__ void fill(int* x, size_t n)
{
	for (int i = 0; i < n; i++)
		x[i] = i + 10;
}
__global__ void processVector(Vector* dev_vector)
{
	fill(dev_vector->data, dev_vector->cData);
}
__global__ void freeMemory(Vector* pData)
{
	delete [] pData->data;
}
int main(void)
{
	Vector* dev_vector, host_vector;
	int* host_data, *dev_data;
	
	host_data = new int[4];

	host_vector.cData = 4;
	host_vector.data = new int[4];

	for(auto i = 0; i < 4; ++i)
		host_vector.data[i] = i;

	cudaError_t err = cudaMalloc((void **)&dev_vector, sizeof(Vector));
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMalloc of dev_vector failed!");
	}

	err = cudaMalloc((void **)&dev_data, sizeof(int)*4);
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMalloc of host_vector.data failed!");
	}

	err = cudaMemcpy(dev_vector, &host_vector, sizeof(Vector), cudaMemcpyHostToDevice);
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMemcpy to cudaMemcpy failed!");
	}

	err = cudaMemcpy(dev_data, host_vector.data, sizeof(int) * 4, cudaMemcpyHostToDevice);
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMemcpy to dev_data failed!");
	}

	err = cudaMemcpy(&(dev_vector->data), &dev_data, sizeof(int*), cudaMemcpyHostToDevice);
	if (err != cudaSuccess)
	{
		fprintf(stderr, "cudaMemcpy to dev_vector->data failed!");
	}

	processVector<<<1, 1>>> (dev_vector);

	err = cudaMemcpy(host_data, dev_data, sizeof(int)*4, cudaMemcpyDeviceToHost);
	freeMemory<<<1, 1>>>(dev_vector);
	cudaFree(dev_vector);
	cudaFree(dev_data);
	delete [] host_data;

	return 0;
}