Автоматизация ввода-вывода CUDA/Пример передачи вектора на устройство
Перейти к навигации
Перейти к поиску
#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;
}