0

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

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

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

4

1 回答 1

0

这是一个常见的问题。当您在主机上执行 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);

请注意,这实际上并未将data区域从主机副本复制A到设备副本。它只是创建一个设备可访问data区域,大小与主机data区域相同。如果您还想复制该data区域,则需要另一个cudaMemcpy操作,使用h_a->dataand d_data

于 2013-05-14T14:00:42.253 回答