Arrays CUDA,动态数组+;数组。malloc和copy

Arrays CUDA,动态数组+;数组。malloc和copy,arrays,dynamic,cuda,Arrays,Dynamic,Cuda,所以我在这个问题上纠缠了一段时间。我的结构如下所示: typedef struct { int size; int dim[DIMENSIONS]; float *data; }matrix; DeviceComp<<<gridSize, blockSize>>>(d_out, d_in); 现在我的问题是如何使用malloc和memcpy。我就是这样做的: matrix * d_in; matrix * d_out; const int THREAD

所以我在这个问题上纠缠了一段时间。我的结构如下所示:

typedef struct 
{
int size;
int dim[DIMENSIONS];
float *data;

}matrix;
DeviceComp<<<gridSize, blockSize>>>(d_out, d_in);
现在我的问题是如何使用malloc和memcpy。我就是这样做的:

matrix * d_in;
matrix * d_out;
const int THREADS_BYTES = sizeof(int) + sizeof(int)*DIMENSIONS + sizeof(float)*h_A->_size;
cudaMalloc((void **) &d_in, THREADS_BYTES);
cudaMemcpy(d_in, h_A, THREADS_BYTES, cudaMemcpyHostToDevice);
编辑:这是我分配h_a的方式:

 matrix  A; // = (matrix*)malloc(sizeof(matrix));
 A._dim[0] = 40;
 A._dim[1] = 60;
 A._size = A._dim[0]*A._dim[1];
 A._data = (float*)malloc(A._size*sizeof(float));
 matrix *h_A = &A; 
其中h_A是我分配的矩阵。我这样称呼我的内核:

typedef struct 
{
int size;
int dim[DIMENSIONS];
float *data;

}matrix;
DeviceComp<<<gridSize, blockSize>>>(d_out, d_in);
DeviceComp(d_out,d_in);

然而,在我的内核中,我无法从结构中获取任何数据,只有数组和变量。

这是一个常见的问题。当您在主机上执行malloc操作时(对于h_a->data),您分配了无法从设备访问的主机数据

详细描述发生的情况以及如何修复

在您的情况下,类似这样的方法应该会起作用:

matrix  A; // = (matrix*)malloc(sizeof(matrix));
A._dim[0] = 40;
A._dim[1] = 60;
A._size = A._dim[0]*A._dim[1];
A._data = (float*)malloc(A._size*sizeof(float));
matrix *h_A = &A; 

float *d_data;
cudaMalloc((void **) &d_data, A._size*sizeof(float));


matrix * d_in;
matrix * d_out;
const int THREADS_BYTES = sizeof(int) + sizeof(int)*DIMENSIONS + sizeof(float)*h_A->_size;
cudaMalloc((void **) &d_in, THREADS_BYTES);
cudaMemcpy(d_in, h_A, THREADS_BYTES, cudaMemcpyHostToDevice);

cudaMemcpy(&(d_in->data), &d_data, sizeof(float *), cudaMemcpyHostToDevice);
请注意,这实际上不会将
数据
区域从
A的主机副本复制到设备副本。它只是使设备可以访问
数据
区域,大小与主机
数据
区域相同。如果还要复制
数据
区域,则需要使用
h\u a->data
d\u data
执行另一个
cudaMemcpy
操作