Dear Stan,
I've taken the source from the testing example:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "magma_v2.h"
#include "magmasparse.h"
#include <iostream>
using namespace std;
int main( int argc, char** argv )
{
int n = 10000;
int *col;
int *row;
double gamma0, omega, eta;
gamma0 = 0.5;
omega=1.0;
eta=1.0;
row = (int*) calloc(n+1, sizeof(int));
col = (int*) calloc(n, sizeof(int));
double *val;
val = (double*) calloc(n, sizeof(double));
for (int i = 0; i < 5000; ++i) {
val[i] = MAGMA_D_MAKE(2.0,0.0);
}
for (int i = 5000; i < 10000; ++i) {
val[i] = MAGMA_D_MAKE(1.0,0.0);
}
row[n] = n;
if (val == NULL) {
fprintf( stderr, "malloc failed\n" );
return 0;
}
else {
fprintf( stderr, "malloc succeeded\n" );
}
magma_int_t info = 0;
magma_init();
magma_print_environment();
magma_dopts zopts;
magma_queue_t queue;
magma_queue_create( 0, &queue );
// double zero = MAGMA_D_MAKE(0.0, 0.0);
magma_d_matrix A={Magma_CSR}, B={Magma_CSR}, dB={Magma_CSR};
magma_d_matrix x={Magma_CSR}, b={Magma_CSR};
int i=1;
magma_dparse_opts( argc, argv, &zopts, &i, queue );
B.blocksize = zopts.blocksize;
B.alignment = zopts.alignment;
magma_dsolverinfo_init( &zopts.solver_par, &zopts.precond_par, queue );
magma_dcsrset(n,n,row,col,val,&A,queue);
// for the eigensolver case
zopts.solver_par.ev_length = A.num_cols;
magma_deigensolverinfo_init( &zopts.solver_par, queue );
// scale matrix
magma_dmscale( &A, zopts.scaling, queue );
// preconditioner
if ( zopts.solver_par.solver != Magma_ITERREF ) {
magma_d_precondsetup( A, b, &zopts.solver_par, &zopts.precond_par, queue );
}
magma_dmconvert( A, &B, Magma_CSR, zopts.output_format, queue );
printf( "\n%% matrix info: %lld-by-%lld with %lld nonzeros\n\n",
(long long) A.num_rows, (long long) A.num_cols, (long long) A.nnz );
printf("matrixinfo = [\n");
printf("%% size (m x n) || nonzeros (nnz) || nnz/m || stored nnz\n");
printf("%%============================================================================%%\n");
printf(" %8lld %8lld %10lld %4lld %10lld\n",
(long long) B.num_rows, (long long) B.num_cols, (long long) B.true_nnz,
(long long) (B.true_nnz/B.num_rows), (long long) B.nnz );
printf("%%============================================================================%%\n");
printf("];\n");
magma_dmtransfer( B, &dB, Magma_CPU, Magma_DEV, queue );
magma_dvinit_rand( &b, Magma_DEV, A.num_rows, 1, queue );
magma_dvinit_rand( &x, Magma_DEV, A.num_cols, 1, queue );
info = magma_d_solver( dB, b, &x, &zopts, queue );
if( info != 0 ) {
printf("%%error: solver returned: %s (%lld).\n",
magma_strerror( info ), (long long) info );
}
zopts.solver_par.verbose = 0;
magma_dmfree(&dB, queue );
magma_dmfree(&B, queue );
magma_dmfree(&A, queue );
magma_dmfree(&x, queue );
magma_dmfree(&b, queue );
magma_queue_destroy( queue );
magma_finalize();
return info;
}
Everything works well!
However, if I start to add non-diagonal elements as:
int n = 10000;
int *col;
int *row;
double gamma0, omega, eta;
gamma0 = 0.5;
omega=1.0;
eta=1.0;
row = (int*) calloc(n+1+1, sizeof(int));
col = (int*) calloc(n+1, sizeof(int));
double *val;
val = (double*) calloc(n+1, sizeof(double));
for (int i = 0; i < 5000; ++i) {
val[i] = MAGMA_D_MAKE(2.0,0.0);
}
for (int i = 5000; i < 10000; ++i) {
val[i] = MAGMA_D_MAKE(1.0,0.0);
}
col[10000] = 100;
row[10000] = 10;
val[10000] = MAGMA_D_MAKE(2.0,0.0);
// It is assumed that symmetric part is automatically added? (I did with it and it dod not help me)
// col[10001] = 10;
// row[10001] = 100;
// val[10001] = MAGMA_D_MAKE(2.0,0.0);
row[n+1] = n+1;
In this case I again obtain memory dump, could you correct me? Thank you in advance!
пятница, 11 декабря 2020 г. в 02:51:04 UTC-5, An Pa: