2013-04-18 26 views
0

嗨,我正在使用cuBLAS做一些矩阵操作。在cuBLAS中,如何从主机获取或设置矩阵元素?

偶尔,我需要获取或设置单个矩阵元素。 按CUBLAS文档,矩阵分配是这样的:

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

现在,如果我需要一个元素改变,我可以使用类似cudaMemset?主机代码为的的正确方法是什么?每次我只更改一个元素时,我不想将整个数组从主机复制到设备。

回答

1

cudaMemset会使用起来很不方便,因为它只能操作字节,所以你应该将float值的每个字节设置为相同的数字。这可能不是你想要的。

cublasSetMatrix已经有能力做平铺副本。这可以达到你的目的,假设你最初有一个矩阵的主机副本。简单地更新在宿主副本中的相应位置,然后做一个cublasSetMatrix呼叫与行数= 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等)

+0

非常感谢Robert! – Alex