在cuBLAS中,如何从主机获取或设置矩阵元素?

时间:2013-04-18 18:17:57

标签: cuda cublas

您好我正在使用cuBLAS进行一些矩阵运算。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

但是cublasSetMatrix已经能够进行平铺复制。假设您最初拥有矩阵的主机副本,这可以满足您的目的。只需更新主机副本中的相应位置,然后执行cublasSetMatrix调用,其中rows = 1,cols = 1,并且A和B矩阵指针指向要在源矩阵和目标矩阵中更新的元素:< / p>

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等),则可以撤消上述操作。