1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
/*
-- MAGMA (version 2.9.0) --
Univ. of Tennessee, Knoxville
Univ. of California, Berkeley
Univ. of Colorado, Denver
@date January 2025
@precisions normal z -> s d c
@author Hartwig Anzt
*/
#include "magmasparse_internal.h"
/**
Purpose
-------
Transposes a vector from col to row major and vice versa.
Arguments
---------
@param[in]
x magma_z_matrix
input vector
@param[out]
y magma_z_matrix*
output vector
@param[in]
queue magma_queue_t
Queue to execute in.
@ingroup magmasparse_zaux
********************************************************************/
extern "C" magma_int_t
magma_zvtranspose(
magma_z_matrix x,
magma_z_matrix *y,
magma_queue_t queue )
{
magma_int_t info = 0;
magma_int_t m = x.num_rows;
magma_int_t n = x.num_cols;
// make sure the target structure is empty
magma_zmfree( y, queue );
y->ownership = MagmaTrue;
magma_z_matrix dx={Magma_CSR}, dy={Magma_CSR};
if ( x.memory_location == Magma_DEV ) {
CHECK( magma_zvinit( y, Magma_DEV, x.num_rows,x.num_cols, MAGMA_Z_ZERO, queue ));
y->num_rows = x.num_rows;
y->num_cols = x.num_cols;
y->storage_type = x.storage_type;
if ( x.major == MagmaColMajor) {
y->major = MagmaRowMajor;
magmablas_ztranspose( m, n, x.val, m, y->val, n, queue );
}
else {
y->major = MagmaColMajor;
magmablas_ztranspose( n, m, x.val, n, y->val, m, queue );
}
} else {
CHECK( magma_zmtransfer( x, &dx, Magma_CPU, Magma_DEV, queue ));
CHECK( magma_zvtranspose( dx, &dy, queue ));
CHECK( magma_zmtransfer( dy, y, Magma_DEV, Magma_CPU, queue ));
}
cleanup:
if( info != 0 ){
magma_zmfree( y, queue );
}
magma_zmfree( &dx, queue );
magma_zmfree( &dy, queue );
return info;
}
|