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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
/*
-- MAGMA (version 2.9.0) --
Univ. of Tennessee, Knoxville
Univ. of California, Berkeley
Univ. of Colorado, Denver
@date January 2025
@generated from testing/testing_zpotf2_gpu.cpp, normal z -> c, Wed Jan 22 14:40:26 2025
*/
// includes, system
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
// includes, project
#include "flops.h"
#include "magma_v2.h"
#include "magma_lapack.h"
#include "testings.h"
/* ////////////////////////////////////////////////////////////////////////////
-- Testing cpotf2_gpu
*/
int main( int argc, char** argv)
{
TESTING_CHECK( magma_init() );
magma_print_environment();
real_Double_t gflops, gpu_perf, gpu_time, cpu_perf, cpu_time;
magmaFloatComplex *h_A, *h_R;
magmaFloatComplex_ptr d_A;
magma_int_t N, n2, lda, ldda, info;
magmaFloatComplex c_neg_one = MAGMA_C_NEG_ONE;
magma_int_t ione = 1;
float Anorm, error, work[1];
int status = 0;
magma_opts opts;
opts.matrix = "rand_dominant"; // default
opts.parse_opts( argc, argv );
float tol = opts.tolerance * lapackf77_slamch("E");
opts.lapack |= opts.check; // check (-c) implies lapack (-l)
printf("%% uplo = %s\n", lapack_uplo_const(opts.uplo) );
printf("%% N CPU Gflop/s (ms) GPU Gflop/s (ms) ||R_magma - R_lapack||_F / ||R_lapack||_F\n");
printf("%%=======================================================\n");
for( int itest = 0; itest < opts.ntest; ++itest ) {
for( int iter = 0; iter < opts.niter; ++iter ) {
N = opts.nsize[itest];
lda = N;
n2 = lda*N;
ldda = magma_roundup( N, opts.align ); // multiple of 32 by default
gflops = FLOPS_CPOTRF( N ) / 1e9;
if ( N > 512 ) {
printf( "%5lld skipping because cpotf2 does not support N > 512\n", (long long) N );
continue;
}
TESTING_CHECK( magma_cmalloc_cpu( &h_A, n2 ));
TESTING_CHECK( magma_cmalloc_pinned( &h_R, n2 ));
TESTING_CHECK( magma_cmalloc( &d_A, ldda*N ));
/* Initialize the matrix */
magma_generate_matrix( opts, N, N, h_A, lda );
lapackf77_clacpy( MagmaFullStr, &N, &N, h_A, &lda, h_R, &lda );
magma_csetmatrix( N, N, h_A, lda, d_A, ldda, opts.queue );
/* ====================================================================
Performs operation using MAGMA
=================================================================== */
gpu_time = magma_sync_wtime( opts.queue );
magma_cpotf2_gpu( opts.uplo, N, d_A, ldda, opts.queue, &info );
gpu_time = magma_sync_wtime( opts.queue ) - gpu_time;
gpu_perf = gflops / gpu_time;
if (info != 0) {
printf("magma_cpotf2_gpu returned error %lld: %s.\n",
(long long) info, magma_strerror( info ));
}
if ( opts.lapack ) {
/* =====================================================================
Performs operation using LAPACK
=================================================================== */
cpu_time = magma_wtime();
lapackf77_cpotrf( lapack_uplo_const(opts.uplo), &N, h_A, &lda, &info );
cpu_time = magma_wtime() - cpu_time;
cpu_perf = gflops / cpu_time;
if (info != 0) {
printf("lapackf77_cpotrf returned error %lld: %s.\n",
(long long) info, magma_strerror( info ));
}
/* =====================================================================
Check the result compared to LAPACK
=================================================================== */
magma_cgetmatrix( N, N, d_A, ldda, h_R, lda, opts.queue );
blasf77_caxpy(&n2, &c_neg_one, h_A, &ione, h_R, &ione);
Anorm = lapackf77_clange("f", &N, &N, h_A, &lda, work);
error = lapackf77_clange("f", &N, &N, h_R, &lda, work) / Anorm;
printf("%5lld %7.2f (%7.2f) %7.2f (%7.2f) %8.2e %s\n",
(long long) N, cpu_perf, cpu_time*1000., gpu_perf, gpu_time*1000.,
error, (error < tol ? "ok" : "failed"));
status += ! (error < tol);
}
else {
printf("%5lld --- ( --- ) %7.2f (%7.2f) --- \n",
(long long) N, gpu_perf, gpu_time*1000. );
}
magma_free_cpu( h_A );
magma_free_pinned( h_R );
magma_free( d_A );
fflush( stdout );
}
if ( opts.niter > 1 ) {
printf( "\n" );
}
}
opts.cleanup();
TESTING_CHECK( magma_finalize() );
return status;
}
|