0

嗨,我正在使用 cuBLAS 进行一些矩阵运算。

有时,我需要获取或设置单个矩阵元素。根据 cuBLAS 文档,矩阵分配如下:

    cudaMalloc((void**)&pArrayDev,sizeof(float)*numRows*numCols);        
    cublasSetMatrix(numRows,numCols,sizeof(float),pArray,numRows,pArrayDev,numRows);

现在,如果我只需要更改一个元素,我可以使用 cudaMemset 之类的东西吗?从主机代码执行此操作的正确方法是什么?每次只更改一个元素时,我都不想将整个数组从主机复制到设备。

4

1 回答 1

1

cudaMemset使用起来很不方便,因为它只对字节进行操作,因此您需要将float值的每个字节设置为相同的数字。这可能不是你想要的。

但是cublasSetMatrix已经具备了进行平铺复制的能力。假设您最初拥有矩阵的主机副本,这可以达到您的目的。只需更新主机副本中的相应位置,然后cublasSetMatrix调用 rows = 1,cols = 1,并且 A 和 B 矩阵指针指向源矩阵和目标矩阵中要更新的元素:

cublasSetMatrix(1,1,sizeof(float),&pArray[offset],numRows,&pArrayDev[offset],numRows);

如果您周围没有矩阵的主机副本,您可以使用cudaMemcpy执行类似的操作:

float updateval = 100.0f;  // or whatever value you want 
cudaMemcpy(&pArrayDev[offset], &updateval, sizeof(float), cudaMemcpyHostToDevice);

如果您想从设备检索单个元素到主机,您可以反转上述操作(例如使用 cublasGetMatrix,或 cudaMemcpyDeviceToHost 等)

于 2013-04-18T18:47:05.097 回答