Esempio n. 1
0
void init_GPU_data(GlobalParams &p) {
    
    int n_known = p.nRegions;
    int n_total = p.pred_dist.n_rows;
    int n_pred = n_total-n_known;
    
    scatr_magma_init();

    arma::mat dist12 = p.pred_dist(arma::span(0,n_known-1),        arma::span(n_known, n_total-1));
    arma::mat dist22 = p.pred_dist(arma::span(n_known, n_total-1), arma::span(n_known, n_total-1));
    
    checkCublasError( cublasCreate_v2(&p.handle), "handle (Create)" );
    
    cudaMalloc((void**) &p.d_dist12, n_known*n_pred*sizeof(double));  checkCudaError("dist12 (Malloc)");
    checkCublasError( 
        cublasSetMatrix(n_known, n_pred, sizeof(double), dist12.memptr(), n_known, p.d_dist12, n_known), 
        "dist12 (Set)" 
    );
    
    cudaMalloc((void**) &p.d_dist22, n_pred*n_pred * sizeof(double));   checkCudaError("dist22 (Malloc)");
    checkCublasError( 
        cublasSetMatrix(n_pred, n_pred, sizeof(double), dist22.memptr(), n_pred, p.d_dist22, n_pred), 
        "dist22 (Set)"
    );
    
    cudaMalloc((void**) &p.d_cov12,    n_known * n_pred  * sizeof(double)); checkCudaError("cov12 (Malloc)");
    cudaMalloc((void**) &p.d_cov22,    n_pred  * n_pred  * sizeof(double)); checkCudaError("cov22 (Malloc)");
    cudaMalloc((void**) &p.d_invcov11, n_known * n_known * sizeof(double)); checkCudaError("invcov11 (Malloc)");
    cudaMalloc((void**) &p.d_tmp,      n_pred  * n_known * sizeof(double)); checkCudaError("tmp (Malloc)");
}
Esempio n. 2
0
File: ardblas.c Progetto: rforge/gcb
void d_gemm(SEXP rtransa, SEXP rtransb, SEXP ralpha, SEXP ra, SEXP rlda,
	SEXP rb, SEXP rldb, SEXP rbeta, SEXP rc, SEXP rldc)
{
	char
		transa = getTranspose(rtransa),
		transb = getTranspose(rtransb);
	double
		alpha = asReal(ralpha), beta = asReal(rbeta),
		* a, * b, * c;
	int
		m, n, k,
		rowsa, colsa, lda = asInteger(rlda),
		rowsb, colsb, ldb = asInteger(rldb),
		rowsc, colsc, ldc = asInteger(rldc);	
		
	unpackMatrix(ra, &rowsa, &colsa, &a);
	unpackMatrix(rb, &rowsb, &colsb, &b);
	unpackMatrix(rc, &rowsc, &colsc, &c);
	
	m = rowsa;
	n = colsb;
	k = colsa;
	
	if(isTranspose(transa)) {
		m = colsa;
		k = rowsa;
	}
	
	if(isTranspose(transb))
		n = rowsb;
	
	cublasDgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc);
	checkCublasError("d_gemm");
}
Esempio n. 3
0
File: ardblas.c Progetto: rforge/gcb
void d_syr2k(SEXP ruplo, SEXP rtrans, SEXP ralpha, SEXP ra, SEXP rlda,
	SEXP rb, SEXP rldb, SEXP rbeta, SEXP rc, SEXP rldc)
{
	char
		trans = getTranspose(rtrans),
		uplo = getSymLoc(ruplo);
	double
		alpha = asReal(ralpha), beta = asReal(rbeta),
		* a, * b, * c;
	int
		k,
		rowsa, colsa, lda = asInteger(rlda),
		rowsb, colsb, ldb = asInteger(rldb),
		rowsc, colsc, ldc = asInteger(rldc);	
	
	k = rowsa;
	if((trans == 'N') || (trans == 'n')) {
		k = colsa;
	}
		
	unpackMatrix(ra, &rowsa, &colsa, &a);
	unpackMatrix(rb, &rowsb, &colsb, &b);
	unpackMatrix(rc, &rowsc, &colsc, &c);
	
	cublasDsyr2k(uplo, trans, rowsc, k, alpha, a, lda, b, ldb, beta, c, ldc);
	checkCublasError("d_syr2k");
}
Esempio n. 4
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_setVector(SEXP v)
{
	int n = length(v);
	double * d_v;

	cublasAlloc(n, sizeof(double), (void **)&d_v);
	cublasSetVector(n, sizeof(double), REAL(v), 1, d_v, 1);
	checkCublasError("d_setVector");
	
	return packVector(n, d_v);
}
Esempio n. 5
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_setMatrix(SEXP m)
{
	int
		rows = nrows(m), cols = ncols(m);
	double * d_m;
	
	cublasAlloc(rows * cols, sizeof(double), (void **)&d_m);
	cublasSetMatrix(rows, cols, sizeof(double), REAL(m), rows, d_m, rows);
	checkCublasError("d_setMatrix");
	
	return packMatrix(rows, cols, d_m);
}
Esempio n. 6
0
File: ardblas.c Progetto: rforge/gcb
void d_scal(SEXP ralpha, SEXP rx, SEXP rincx)
{
	int
		n, 
		incx = asInteger(rincx);
	double
		* x, alpha = asReal(ralpha);

	unpackVector(rx, &n, &x);

	cublasDscal(n, alpha, x, incx);
	checkCublasError("d_scal");
}
Esempio n. 7
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_asum(SEXP vList, SEXP inc)
{
	int n, increment = asInteger(inc);
	double * dPtr;
	unpackVector(vList, &n, &dPtr);

	SEXP out;
	PROTECT(out = allocVector(REALSXP, 1));
	REAL(out)[0] = cublasDasum(n, dPtr, increment);
	checkCublasError("d_asum");
	UNPROTECT(1);
	return out;
}
Esempio n. 8
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_getVector(SEXP vList, SEXP inc)
{
	int n, increment = asInteger(inc);
	double * dPtr;
	unpackVector(vList, &n, &dPtr);

	SEXP out;
	PROTECT(out = allocVector(REALSXP, n));
	cublasGetVector(n, sizeof(double), dPtr, increment, REAL(out), 1);
	checkCublasError("d_getVector");
	UNPROTECT(1);
	return out;
}
Esempio n. 9
0
void cleanup_GPU_data(GlobalParams &p) {
    
    scatr_magma_finalize();

    checkCublasError( 
        cublasDestroy_v2(p.handle), "handle (Destroy)" 
    );
    
    cudaFree(p.d_dist12);   checkCudaError("dist12 (Free)");
    cudaFree(p.d_dist22);   checkCudaError("dist22 (Free)");
    cudaFree(p.d_cov12);    checkCudaError("cov12 (Free)");
    cudaFree(p.d_cov22);    checkCudaError("cov22 (Free)");
    cudaFree(p.d_invcov11); checkCudaError("invcov11 (Free)");
    cudaFree(p.d_tmp);      checkCudaError("tmp (Free)");
}
Esempio n. 10
0
File: ardblas.c Progetto: rforge/gcb
void d_swap(SEXP rx, SEXP rincx, SEXP ry, SEXP rincy)
{
	int
		nx, ny, n,
		incx = asInteger(rincx),
		incy = asInteger(rincy);
	double
		* x, * y;

	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	n = imin2(nx, ny);

	cublasDswap(n, x, incx, y, incy);
	checkCublasError("d_swap");
}
Esempio n. 11
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_nrm2(SEXP rx, SEXP rincx)
{
	int
		n, 
		incx = asInteger(rincx);
	double * x;

	unpackVector(rx, &n, &x);

	SEXP out;
	PROTECT(out = allocVector(REALSXP, 1));
	REAL(out)[0] = cublasDnrm2(n, x, incx);
	checkCublasError("d_nrm2");
	UNPROTECT(1);
	return out;
}
Esempio n. 12
0
File: ardblas.c Progetto: rforge/gcb
void d_syr(SEXP ruplo, SEXP ralpha, SEXP rx, SEXP rincx, SEXP ra, SEXP rlda)
{
	char
		uplo = getSymLoc(ruplo);
	double
		alpha = asReal(ralpha), * a, * x;
	int
		rowsa, colsa, lda = asInteger(rlda),
		nx, incx = asInteger(rincx);

	unpackVector(rx, &nx, &x);
	unpackMatrix(ra, &rowsa, &colsa, &a);

	cublasDsyr(uplo, rowsa, alpha, x, incx, a, lda);
	checkCublasError("d_syr");
}
Esempio n. 13
0
File: ardblas.c Progetto: rforge/gcb
void d_axpy(SEXP ralpha, SEXP rx, SEXP rincx, SEXP ry, SEXP rincy)
{
	int
		nx, ny, n,
		incx = asInteger(rincx),
		incy = asInteger(rincy);
	double
		alpha = asReal(ralpha),
		* x, * y;

	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	n = imin2(nx, ny);

	cublasDaxpy(n, alpha, x, incx, y, incy);
	checkCublasError("d_axpy");
}
Esempio n. 14
0
File: ardblas.c Progetto: rforge/gcb
void d_rot(SEXP rx, SEXP rincx, SEXP ry, SEXP rincy, SEXP rsc, SEXP rss)
{
	int
		nx, ny, n,
		incx = asInteger(rincx),
		incy = asInteger(rincy);
	double
		sc = asReal(rsc),
		ss = asReal(rss),
		* x, * y;

	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	n = imin2(nx, ny);

	cublasDrot(n, x, incx, y, incy, sc, ss);
	checkCublasError("d_rot");
}
Esempio n. 15
0
File: ardblas.c Progetto: rforge/gcb
void d_rotm(SEXP rx, SEXP rincx, SEXP ry, SEXP rincy, SEXP rsparam)
{
	int
		nx, ny, n, ns,
		incx = asInteger(rincx),
		incy = asInteger(rincy);
	double
		* sparam,
		* x, * y;

	unpackVector(rsparam, &ns, &sparam);
	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	n = imin2(nx, ny);

	cublasDrotm(n, x, incx, y, incy, sparam);
	checkCublasError("d_rotm");
}
Esempio n. 16
0
File: ardblas.c Progetto: rforge/gcb
void d_tpsv(SEXP ruplo, SEXP rtrans, SEXP rdiag, SEXP ra, SEXP rx, SEXP rincx)
{
	char
		uplo = getSymLoc(ruplo),
		trans = getTranspose(rtrans), 
		diag = getUnitTri(rdiag);
	double
		* a, * x;
	int
		rowsa, colsa,
		nx, incx = asInteger(rincx);

	unpackVector(rx, &nx, &x);
	unpackMatrix(ra, &rowsa, &colsa, &a);

	cublasDtpsv(uplo, trans, diag, rowsa, a, x, incx);
	checkCublasError("d_tpsv");
}
Esempio n. 17
0
File: ardblas.c Progetto: rforge/gcb
void d_spmv(SEXP ruplo, SEXP ralpha, SEXP ra, SEXP rx, SEXP rincx,
	SEXP rbeta, SEXP ry, SEXP rincy)
{
	char
		uplo = getSymLoc(ruplo);
	double
		alpha = asReal(ralpha), beta = asReal(rbeta),
		* a, * x, * y;
	int
		rowsa, colsa,
		nx, ny, incx = asInteger(rincx), incy = asInteger(rincy);

	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	unpackMatrix(ra, &rowsa, &colsa, &a);

	cublasDspmv(uplo, rowsa, alpha, a, x, incx, beta, y, incy);
	checkCublasError("d_spmv");
}
Esempio n. 18
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_dot(SEXP rx, SEXP rincx, SEXP ry, SEXP rincy)
{
	int
		nx, ny, n,
		incx = asInteger(rincx),
		incy = asInteger(rincy);
	double
		* x, * y;

	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	n = imin2(nx, ny);

	SEXP out;
	PROTECT(out = allocVector(REALSXP, 1));
	REAL(out)[0] = cublasDdot(n, x, incx, y, incy); 
	checkCublasError("d_dot");
	UNPROTECT(1);
	return out;
}
Esempio n. 19
0
File: ardblas.c Progetto: rforge/gcb
void d_ger(SEXP ralpha, SEXP rx, SEXP rincx, SEXP ry, SEXP rincy,
	SEXP ra, SEXP rlda)
{
	double
		alpha = asReal(ralpha),
		* a, * x, * y;
	int
		rowsa, colsa,
		lda = asInteger(rlda),
		nx, ny,
		incx = asInteger(rincx),
		incy = asInteger(rincy);

	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	unpackMatrix(ra, &rowsa, &colsa, &a);

	cublasDger(rowsa, colsa, alpha, x, incx, y, incy, a, lda);
	checkCublasError("d_ger");
}
Esempio n. 20
0
File: ardblas.c Progetto: rforge/gcb
void d_trsm(SEXP rside, SEXP ruplo, SEXP rtrans, SEXP rdiag,
	SEXP ralpha, SEXP ra, SEXP rlda, SEXP rb, SEXP rldb)
{
	char
		trans = getTranspose(rtrans),
		diag = getUnitTri(rdiag),
		side = getSide(rside),
		uplo = getSymLoc(ruplo);
	double
		alpha = asReal(ralpha),
		* a, * b;
	int
		rowsa, colsa, lda = asInteger(rlda),
		rowsb, colsb, ldb = asInteger(rldb);	
		
	unpackMatrix(ra, &rowsa, &colsa, &a);
	unpackMatrix(rb, &rowsb, &colsb, &b);
	
	cublasDtrsm(side, uplo, trans, diag, rowsb, colsb, alpha, a, lda, b, ldb);
	checkCublasError("d_trsm");
}
Esempio n. 21
0
File: ardblas.c Progetto: rforge/gcb
SEXP d_getMatrix(SEXP mList, SEXP rld)
{
	int
		rows, cols, ld = asInteger(rld);
	double * dPtr;
	
	unpackMatrix(mList, &rows, &cols, &dPtr);

	SEXP out, dim;
	PROTECT(out = allocVector(REALSXP, rows * cols));
	cublasGetMatrix(rows, cols, sizeof(double), dPtr, ld, REAL(out), rows);
	checkCublasError("d_getMatrix");

	PROTECT(dim = allocVector(INTSXP, 2));
	INTEGER(dim)[0] = rows;
	INTEGER(dim)[1] = cols;
	setAttrib(out, R_DimSymbol, dim);

	UNPROTECT(2);
	return out;
}
Esempio n. 22
0
File: ardblas.c Progetto: rforge/gcb
void d_gemv(SEXP rtrans, SEXP ralpha, SEXP ra, SEXP rlda, SEXP rx, SEXP rincx,
	SEXP rbeta, SEXP ry, SEXP rincy)
{
	char
		trans = getTranspose(rtrans);
	double
		alpha = asReal(ralpha), beta = asReal(rbeta),
		* a, * x, * y;
	int
		nx, ny, rowsa, colsa,
		lda = asInteger(rlda),
		incx = asInteger(rincx),
		incy = asInteger(rincy);
		
	unpackVector(rx, &nx, &x);
	unpackVector(ry, &ny, &y);
	unpackMatrix(ra, &rowsa, &colsa, &a);
	
	cublasDgemv(trans, rowsa, colsa, alpha, a, lda, x, incx, beta, y, incy);
	checkCublasError("d_gemv");
}
Esempio n. 23
0
File: ardblas.c Progetto: rforge/gcb
void d_symm(SEXP rside, SEXP ruplo, SEXP ralpha, SEXP ra, SEXP rlda,
	SEXP rb, SEXP rldb, SEXP rbeta, SEXP rc, SEXP rldc)
{
	char
		side = getSide(rside),
		uplo = getSymLoc(ruplo);
	double
		alpha = asReal(ralpha), beta = asReal(rbeta),
		* a, * b, * c;
	int
		rowsa, colsa, lda = asInteger(rlda),
		rowsb, colsb, ldb = asInteger(rldb),
		rowsc, colsc, ldc = asInteger(rldc);	
		
	unpackMatrix(ra, &rowsa, &colsa, &a);
	unpackMatrix(rb, &rowsb, &colsb, &b);
	unpackMatrix(rc, &rowsc, &colsc, &c);
	
	cublasDsymm(side, uplo, rowsb, colsb, alpha, a, lda, b, ldb,
		beta, c, ldc);
	checkCublasError("d_symm");
}