如何在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),可用于转置矩阵。 它在这里记录 。