extern "C" magma_int_t magma_zmcsrcompressor( magma_z_matrix *A, magma_queue_t queue ) { magma_int_t info = 0; magma_z_matrix B={Magma_CSR}; magma_z_matrix hA={Magma_CSR}, CSRA={Magma_CSR}; if ( A->memory_location == Magma_CPU && A->storage_type == Magma_CSR ) { CHECK( magma_zmconvert( *A, &B, Magma_CSR, Magma_CSR, queue )); magma_free_cpu( A->row ); magma_free_cpu( A->col ); magma_free_cpu( A->val ); CHECK( magma_z_csr_compressor(&B.val, &B.row, &B.col, &A->val, &A->row, &A->col, &A->num_rows, queue )); A->nnz = A->row[A->num_rows]; } else { magma_storage_t A_storage = A->storage_type; magma_location_t A_location = A->memory_location; CHECK( magma_zmtransfer( *A, &hA, A->memory_location, Magma_CPU, queue )); CHECK( magma_zmconvert( hA, &CSRA, hA.storage_type, Magma_CSR, queue )); CHECK( magma_zmcsrcompressor( &CSRA, queue )); magma_zmfree( &hA, queue ); magma_zmfree( A, queue ); CHECK( magma_zmconvert( CSRA, &hA, Magma_CSR, A_storage, queue )); CHECK( magma_zmtransfer( hA, A, Magma_CPU, A_location, queue )); magma_zmfree( &hA, queue ); magma_zmfree( &CSRA, queue ); } cleanup: magma_zmfree( &hA, queue ); magma_zmfree( &CSRA, queue ); magma_zmfree( &B, queue ); return info; }
extern "C" magma_int_t magma_zmshrink( magma_z_matrix A, magma_z_matrix *B, magma_queue_t queue ) { magma_int_t info = 0; magma_z_matrix hA={Magma_CSR}, hACSR={Magma_CSR}, hB={Magma_CSR}, hBCSR={Magma_CSR}; if( A.num_rows<=A.num_cols){ if( A.memory_location == Magma_CPU && A.storage_type == Magma_CSR ){ CHECK( magma_zmconvert( A, B, Magma_CSR, Magma_CSR, queue )); for(magma_int_t i=0; i<A.nnz; i++){ if( B->col[i] >= A.num_rows ){ B->val[i] = MAGMA_Z_ZERO; } } CHECK( magma_zmcsrcompressor( B, queue ) ); B->num_cols = B->num_rows; } else { CHECK( magma_zmtransfer( A, &hA, A.memory_location, Magma_CPU, queue )); CHECK( magma_zmconvert( hA, &hACSR, A.storage_type, Magma_CSR, queue )); CHECK( magma_zmshrink( hACSR, &hBCSR, queue )); CHECK( magma_zmconvert( hBCSR, &hB, Magma_CSR, A.storage_type, queue )); CHECK( magma_zmtransfer( hB, B, Magma_CPU, A.memory_location, queue )); } } else { printf("%% error: A has too many rows: m > n.\n"); info = MAGMA_ERR_NOT_SUPPORTED; goto cleanup; } cleanup: magma_zmfree( &hA, queue ); magma_zmfree( &hB, queue ); magma_zmfree( &hACSR, queue ); magma_zmfree( &hBCSR, queue ); return info; }