CUDA,动态数组+数组。 malloc和副本

时间:2013-05-14 09:05:57

标签: arrays dynamic cuda

所以我一直坚持这个问题。我的结构看起来像这样:

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

}matrix;

现在我的问题是如何使用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是我分配的矩阵。我这样称呼我的内核:

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

但是,在我的内核中,我无法从结构中获取任何数据,只能访问数组和变量。

1 个答案:

答案 0 :(得分:0)

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

This answer详细描述了正在发生的事情以及如何解决这个问题。

在你的情况下,这样的事情应该有效:

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);

请注意,这实际上并不会将data区域从A的主机副本复制到设备副本。它只是创建一个设备可访问的data区域,大小与主机data区域相同。如果您还要复制data区域,则需要使用cudaMemcpyh_a->data进行其他d_data操作。

相关问题