如何在CUDA / cublas中转置矩阵?
假设我在GPU上有一个尺寸为A*B
的矩阵,其中B
(列数)是假设C样式的前导维度。 在CUDA(或Cublas)中是否有任何方法将此矩阵转换为FORTRAN样式,其中A
(行数)成为主要维度?
如果它可以在host->device
传输期间进行转置,同时保持原始数据不变,那就更好了。
CUDA SDK包含一个矩阵转置 ,您可以在这里看到有关如何实现一个代码的示例,从简单的实现到优化的版本。
例如:
天真的转置
__global__ void transposeNaive(float *odata, float* idata, int width, int height, int nreps) { int xIndex = blockIdx.x*TILE_DIM + threadIdx.x; int yIndex = blockIdx.y*TILE_DIM + threadIdx.y; int index_in = xIndex + width * yIndex; int index_out = yIndex + height * xIndex; for (int r=0; r < nreps; r++) { for (int i=0; i
就像talonmies指出的那样你可以指定你是否想要将矩阵作为转置操作,在Cublas矩阵运算中,例如:for cublasDgemm()其中C = a * op(A)* op(B)+ b * C,假设你希望操作A作为转置(A ^ T),你可以指定的参数是否('N'正常或'T'转置)
如标题中所要求的那样,为了转置设备行主矩阵A [m] [n],可以这样做:
float* clone = ...;//copy content of A to clone float const alpha(1.0); float const beta(0.0); cublasHandle_t handle; cublasCreate(&handle); cublasSgeam( handle, CUBLAS_OP_T, CUBLAS_OP_N, m, n, &alpha, clone, n, &beta, clone, m, A, m ); cublasDestroy(handle);
并且,要乘以两个行主矩阵A [m] [k] B [k] [n],C = A * B
cublasSgemm( handle, CUBLAS_OP_N, CUBLAS_OP_N, n, m, k, &alpha, B, n, A, k, &beta, C, n );
其中C也是行主矩阵。
与CUDA 5工具包捆绑在一起的CUBLAS版本包含一个类似BLAS的方法(cublasgeam),可用于转置矩阵。 它在这里记录 。