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