您好我正在使用cuBLAS进行一些矩阵运算。
偶尔,我需要获取或设置单个矩阵元素。 根据cuBLAS文档,矩阵的分配如下:
cudaMalloc((void**)&pArrayDev,sizeof(float)*numRows*numCols);
cublasSetMatrix(numRows,numCols,sizeof(float),pArray,numRows,pArrayDev,numRows);
现在,如果我只需要改变一个元素,我可以使用像cudaMemset这样的东西吗?从主机代码执行此操作的正确方法是什么?每次我只更改一个元素时,我不想将整个数组从主机复制到设备。
答案 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等),则可以撤消上述操作。