复制跨步数据(往返于CUDA设备)的有效方法?

是否有可能有效地将由恒定(或甚至非常数)值跨越的数据复制到CUDA设备和从CUDA设备复制?

我想对角化一个大的对称矩阵。

使用jacobi算法,在每次迭代中使用两行和两列进行一系列操作。

由于Matrix本身太大而无法完全复制到设备,因此我正在寻找将两行和两列复制到设备的方法。

使用三角矩阵forms存储数据会很好,但还有其他缺点

  • 非恒定行长[不是那种问题]
  • 列值的非恒定步幅[每行的步幅增加1。]

出现。 [编辑:即使使用三角形,仍然无法将整个Matrix存储在GPU上。]

我查看了一些时间并认识到逐个复制跨步值非常慢(同步和异步)。

//编辑:删除解决方案 – 添加了答案

感谢Robert Crovella给出正确的使用cudamemcpy2d的提示。 我会附上我的测试代码,让每个人都有可能理解……

如果有人提出使用行主要有序三角矩阵解决复制问题的建议 – 请随意写另一个答案。

__global__ void setValues (double *arr, double value) { arr[blockIdx.x] = value; } int main( void ) { // define consts static size_t const R = 10, C = 10, RC = R*C; // create matrices and initialize double * matrix = (double*) malloc(RC*sizeof(double)), *final_matrix = (double*) malloc(RC*sizeof(double)); for (size_t i=0; i>>(dev_col, 88.0); // column should be 88 setValues<<>>(dev_row, 99.0); // row should be 99 // backcopy cudaMemcpy(&final_matrix[selected_row*C], dev_row, C * sizeof(double), cudaMemcpyDeviceToHost); cudaMemcpy2D(&final_matrix[selected_col], C*sizeof(double), dev_col, sizeof(double), sizeof(double), R, cudaMemcpyDeviceToHost); cudaDeviceSynchronize(); // output for checking functionality printf("Initial Matrix:\n"); for (size_t i=0; i