所以我一直坚持这个问题。我的结构看起来像这样:
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);
但是,在我的内核中,我无法从结构中获取任何数据,只能访问数组和变量。
答案 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
区域,则需要使用cudaMemcpy
和h_a->data
进行其他d_data
操作。