Decir que tengo una matriz con una dimensión de A*B en la GPU, donde B (número de columnas) es la principal dimensión asumiendo un estilo de C. ¿Hay algún método en CUDA (o cublas) para transponer esta matriz a FORTRAN estilo, donde A (número de filas) se convierte en el líder de dimensión?

Es incluso mejor si podría ser incorporadas durante host->device de transferencia, mientras que mantener los datos originales sin cambios.

  • Porque CUBLAS puede operar en ambos transpuesto y normal de las matrices, es probable que no necesitan explícitamente calcular la matriz transpuesta, incluso cuando se trabaja con matrices que están en el orden de fila principal.
  • Parece que el uso de cublas<t>geam, como se sugiere a continuación, es una forma muy eficiente para realizar la matriz de la transposición en CUDA. Para un código completo y una comparación con la matriz de transposición mediante Empuje, consulte ¿Cuál es la forma más eficiente para transponer una matriz en CUDA?.

3 Comentarios

  1. 4

    El CUDA SDK incluye una matriz transpuesta, se puede ver aquí ejemplos de código sobre cómo implementar uno, que van desde un ingenuo aplicación a las versiones optimizadas.

    Por ejemplo:

    Ingenuo transponer

    __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<TILE_DIM; i+=BLOCK_ROWS)
            {
              odata[index_out+i] = idata[index_in+i*width];
            }
        }
    }

    Como talonmies había punto de salida se puede especificar si desea operar la matriz como transpuesto o no, en cublas operaciones de matriz ej.: para cublasDgemm() donde C = a * op(A) * op(B) + b * C, suponiendo que usted desea utilizar Una como transpuesto (A^T), en los parámetros que se pueden especificar si se trata de (‘N’ normales o ‘T’ transpuesta)

    • Hola, sé que este es un par de años de retraso. Pero hay una manera de hacer esto en su lugar? He probado el ingenuo solución mediante el mantenimiento de una variable temp, pero no parece funcionar para un no-sq matriz.
    • Para la ejecución secuencial se conocen algoritmos. En GPUs sé acerca de esto impact.crhc.illinois.edu/shared/papers/p207-sung.pdf puede ayudar a usted.
    • Gracias por el libro!
    • Np, se bienvenido.
  2. 9

    como en el título, a la transposición de un dispositivo principal de la fila de la matriz A[m][n], uno puede hacer de esta manera:

        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);

    Y, para multiplicar dos principales de la fila de las matrices 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 );

    donde C es también un principal de la fila de la matriz.

    • Es posible hacer esto sin un clon?
  3. 4

    La versión de CUBLAS junto con el CUDA 5 kit de herramientas contiene un BLAS-como método (cublasgeam) que podría ser utilizado para transponer una matriz. Está documentado aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here