VALUE rb_blas_ixamax(int argc, VALUE *argv, VALUE self) { Matrix *dx; int incx; int incy; int n; //char error_msg[64]; VALUE n_value, incx_value; rb_scan_args(argc, argv, "02", &incx_value, &n_value); Data_Get_Struct(self, Matrix, dx); if(incx_value == Qnil) incx = 1; else incx = NUM2INT(incx_value); if(n_value == Qnil) n = dx->nrows; else n = NUM2INT(n_value); if(dx == NULL || dx->ncols != 1) { //sprintf(error_msg, ); rb_raise(rb_eRuntimeError, "Self is not a Vector"); } switch(dx->data_type) { case Single_t: //s return INT2FIX(cblas_isamax(n , (float *)dx->data, incx)); case Double_t: //d return INT2FIX(cblas_idamax(n , (double *)dx->data, incx)); case Complex_t: //c return INT2FIX(cblas_icamax(n , dx->data, incx)); case Double_Complex_t: //z return INT2FIX(cblas_izamax(n , dx->data, incx)); default: //sprintf(error_msg, "Invalid data_type (%d) in Matrix", dx->data_type); rb_raise(rb_eRuntimeError, "Invalid data_type (%d) in Matrix", dx->data_type); return Qnil; //Never reaches here. } }
static void CORE_cgetrf_reclap_rec(const int M, const int N, PLASMA_Complex32_t *A, const int LDA, int *IPIV, int *info, const int thidx, const int thcnt, const int column) { int jp, n1, n2, lm, loff; PLASMA_Complex32_t tmp1, tmp2, tmp3; PLASMA_Complex32_t *Atop = A + column*LDA; /* Assumption: N = min( M, N ); */ if (N > 1) { int coff, ccnt; n1 = N / 2; n2 = N - n1; CORE_cgetrf_reclap_rec( M, n1, A, LDA, IPIV, info, thidx, thcnt, column ); if ( *info != 0 ) return; CORE_cgetrf_reclap_update(M, column, n1, n2, A, LDA, IPIV, thidx, thcnt); CORE_cgetrf_reclap_rec( M, n2, A, LDA, IPIV, info, thidx, thcnt, column + n1 ); if ( *info != 0 ) return; psplit( n1, thidx, thcnt, &coff, &ccnt ); if (ccnt > 0) { CORE_claswap1( ccnt, Atop+coff*LDA, LDA, n1 + column, N + column, IPIV ); /* swap to the left */ } } else { int thrd; CORE_cbarrier_thread( thidx, thcnt ); psplit( M, thidx, thcnt, &loff, &lm ); if (thidx == 0) { loff = column; lm -= column; } tmp2 = Atop[column]; /* all threads read the pivot element in case they need it */ jp = cblas_icamax( lm, Atop + loff, 1 ); tmp1 = Atop[loff + jp]; CORE_camax1_thread( tmp1, thidx, thcnt, &thrd, &tmp3, loff + jp + 1, IPIV + column ); Atop[column] = tmp3; /* all threads set the pivot element: no need for synchronization */ if ( tmp3 != 0.0 ) { if ( cabsf(tmp3) >= sfmin ) { PLASMA_Complex32_t tmp = (PLASMA_Complex32_t)1.0 / tmp3; n1 = (thidx == 0) ? 1 : 0; cblas_cscal( lm - n1, CBLAS_SADDR(tmp), Atop + loff + n1, 1 ); } else { int i; PLASMA_Complex32_t *Atop2; n1 = (thidx == 0) ? 1 : 0; Atop2 = Atop + loff + n1; for( i=0; i < lm-n1; i++, Atop2++) *Atop2 = *Atop2 / tmp3; } if (thrd == thidx) { /* the thread that owns the best pivot */ if (loff + jp != column) /* if there is a need to exchange the pivot */ Atop[loff + jp] = tmp2 / tmp3; } } else { *info = column + 1; return; } CORE_cbarrier_thread( thidx, thcnt ); } }
void test_amax (void) { { int N = 1; float X[] = { -0.388f }; int incX = -1; int expected = 0; int k; k = cblas_isamax(N, X, incX); gsl_test_int(k, expected, "samax(case 52)"); }; { int N = 1; double X[] = { 0.247 }; int incX = -1; int expected = 0; int k; k = cblas_idamax(N, X, incX); gsl_test_int(k, expected, "damax(case 53)"); }; { int N = 1; float X[] = { 0.704f, 0.665f }; int incX = -1; int expected = 0; int k; k = cblas_icamax(N, X, incX); gsl_test_int(k, expected, "camax(case 54)"); }; { int N = 1; double X[] = { -0.599, -0.758 }; int incX = -1; int expected = 0; int k; k = cblas_izamax(N, X, incX); gsl_test_int(k, expected, "zamax(case 55)"); }; { int N = 2; float X[] = { 0.909f, 0.037f }; int incX = 1; int expected = 0; int k; k = cblas_isamax(N, X, incX); gsl_test_int(k, expected, "samax(case 56)"); }; { int N = 2; double X[] = { 0.271, -0.426 }; int incX = 1; int expected = 1; int k; k = cblas_idamax(N, X, incX); gsl_test_int(k, expected, "damax(case 57)"); }; { int N = 2; float X[] = { -0.648f, 0.317f, 0.62f, 0.392f }; int incX = 1; int expected = 1; int k; k = cblas_icamax(N, X, incX); gsl_test_int(k, expected, "camax(case 58)"); }; { int N = 2; double X[] = { -0.789, 0.352, 0.562, 0.697 }; int incX = 1; int expected = 1; int k; k = cblas_izamax(N, X, incX); gsl_test_int(k, expected, "zamax(case 59)"); }; { int N = 2; float X[] = { 0.487f, 0.918f }; int incX = -1; int expected = 0; int k; k = cblas_isamax(N, X, incX); gsl_test_int(k, expected, "samax(case 60)"); }; { int N = 2; double X[] = { 0.537, 0.826 }; int incX = -1; int expected = 0; int k; k = cblas_idamax(N, X, incX); gsl_test_int(k, expected, "damax(case 61)"); }; { int N = 2; float X[] = { 0.993f, 0.172f, -0.825f, 0.873f }; int incX = -1; int expected = 0; int k; k = cblas_icamax(N, X, incX); gsl_test_int(k, expected, "camax(case 62)"); }; { int N = 2; double X[] = { 0.913, -0.436, -0.134, 0.129 }; int incX = -1; int expected = 0; int k; k = cblas_izamax(N, X, incX); gsl_test_int(k, expected, "zamax(case 63)"); }; }
int F77_icamax(const int *N, const void *X, const int *incX) { if (*N < 1 || *incX < 1) return(0); return (cblas_icamax(*N, X, *incX)+1); }
// // Overloaded function for dispatching to // * CBLAS backend, and // * complex<float> value-type. // inline std::ptrdiff_t iamax( const int n, const std::complex<float>* x, const int incx ) { return cblas_icamax( n, x, incx ); }