#include "private.h"
#include
int gpublas_setup(gpucontext *ctx) {
if (ctx->blas_ops == NULL)
return GA_UNSUPPORTED_ERROR;
return ctx->blas_ops->setup(ctx);
}
void gpublas_teardown(gpucontext *ctx) {
if (ctx->blas_ops != NULL)
return ctx->blas_ops->teardown(ctx);
}
const char *gpublas_error(gpucontext *ctx) {
if (ctx->blas_ops != NULL)
return ctx->blas_ops->error(ctx);
return "No blas ops available, API error.";
}
int gpublas_hgemv(cb_order order, cb_transpose transA,
size_t M, size_t N, float alpha,
gpudata *A, size_t offA, size_t lda,
gpudata *X, size_t offX, int incX,
float beta,
gpudata *Y, size_t offY, int incY) {
return gpudata_context(A)->blas_ops->hgemv(
order, transA, M, N, alpha, A, offA, lda,
X, offX, incX, beta, Y, offY, incY);
}
int gpublas_sgemv(cb_order order, cb_transpose transA,
size_t M, size_t N, float alpha,
gpudata *A, size_t offA, size_t lda,
gpudata *X, size_t offX, int incX,
float beta,
gpudata *Y, size_t offY, int incY) {
return gpudata_context(A)->blas_ops->sgemv(
order, transA, M, N, alpha, A, offA, lda,
X, offX, incX, beta, Y, offY, incY);
}
int gpublas_dgemv(cb_order order, cb_transpose transA,
size_t M, size_t N, double alpha,
gpudata *A, size_t offA, size_t lda,
gpudata *X, size_t offX, int incX,
double beta,
gpudata *Y, size_t offY, int incY) {
return gpudata_context(A)->blas_ops->dgemv(
order, transA, M, N, alpha, A, offA, lda,
X, offX, incX, beta, Y, offY, incY);
}
int gpublas_hgemm(cb_order order, cb_transpose transA, cb_transpose transB,
size_t M, size_t N, size_t K, float alpha,
gpudata *A, size_t offA, size_t lda,
gpudata *B, size_t offB, size_t ldb,
float beta, gpudata *C, size_t offC, size_t ldc) {
return gpudata_context(A)->blas_ops->hgemm(
order, transA, transB, M, N, K, alpha, A, offA, lda,
B, offB, ldb, beta, C, offC, ldc);
}
int gpublas_sgemm(cb_order order, cb_transpose transA, cb_transpose transB,
size_t M, size_t N, size_t K, float alpha,
gpudata *A, size_t offA, size_t lda,
gpudata *B, size_t offB, size_t ldb,
float beta, gpudata *C, size_t offC, size_t ldc) {
return gpudata_context(A)->blas_ops->sgemm(
order, transA, transB, M, N, K, alpha, A, offA, lda,
B, offB, ldb, beta, C, offC, ldc);
}
int gpublas_dgemm(cb_order order, cb_transpose transA, cb_transpose transB,
size_t M, size_t N, size_t K, double alpha,
gpudata *A, size_t offA, size_t lda,
gpudata *B, size_t offB, size_t ldb,
double beta, gpudata *C, size_t offC, size_t ldc) {
return gpudata_context(A)->blas_ops->dgemm(
order, transA, transB, M, N, K, alpha, A, offA, lda,
B, offB, ldb, beta, C, offC, ldc);
}
int gpublas_hger(cb_order order, size_t M, size_t N, float alpha,
gpudata *X, size_t offX, int incX,
gpudata *Y, size_t offY, int incY,
gpudata *A, size_t offA, size_t lda) {
return gpudata_context(X)->blas_ops->hger(
order, M, N, alpha, X, offX, incX, Y, offY, incY, A, offA, lda);
}
int gpublas_sger(cb_order order, size_t M, size_t N, float alpha,
gpudata *X, size_t offX, int incX,
gpudata *Y, size_t offY, int incY,
gpudata *A, size_t offA, size_t lda) {
return gpudata_context(X)->blas_ops->sger(
order, M, N, alpha, X, offX, incX, Y, offY, incY, A, offA, lda);
}
int gpublas_dger(cb_order order, size_t M, size_t N, double alpha,
gpudata *X, size_t offX, int incX,
gpudata *Y, size_t offY, int incY,
gpudata *A, size_t offA, size_t lda) {
return gpudata_context(X)->blas_ops->dger(
order, M, N, alpha, X, offX, incX, Y, offY, incY, A, offA, lda);
}
int gpublas_hgemmBatch(
cb_order order, cb_transpose transA, cb_transpose transB,
size_t M, size_t N, size_t K, float alpha,
gpudata **A, size_t *offA, size_t lda,
gpudata **B, size_t *offB, size_t ldb,
float beta, gpudata **C, size_t *offC, size_t ldc,
size_t batchCount, int flags) {
if (flags != 0) return GA_INVALID_ERROR;
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(A[0])->blas_ops->hgemmBatch(
order, transA, transB, M, N, K, alpha, A, offA, lda,
B, offB, ldb, beta, C, offC, ldc, batchCount);
}
int gpublas_sgemmBatch(
cb_order order, cb_transpose transA, cb_transpose transB,
size_t M, size_t N, size_t K, float alpha,
gpudata **A, size_t *offA, size_t lda,
gpudata **B, size_t *offB, size_t ldb,
float beta, gpudata **C, size_t *offC, size_t ldc,
size_t batchCount, int flags) {
if (flags != 0) return GA_INVALID_ERROR;
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(A[0])->blas_ops->sgemmBatch(
order, transA, transB, M, N, K, alpha, A, offA, lda,
B, offB, ldb, beta, C, offC, ldc, batchCount);
}
int gpublas_dgemmBatch(
cb_order order, cb_transpose transA, cb_transpose transB,
size_t M, size_t N, size_t K, double alpha,
gpudata **A, size_t *offA, size_t lda,
gpudata **B, size_t *offB, size_t ldb,
double beta, gpudata **C, size_t *offC, size_t ldc,
size_t batchCount, int flags) {
if (flags != 0) return GA_INVALID_ERROR;
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(A[0])->blas_ops->dgemmBatch(
order, transA, transB, M, N, K, alpha, A, offA, lda,
B, offB, ldb, beta, C, offC, ldc, batchCount);
}
int gpublas_hgemvBatch(
cb_order order, cb_transpose transA,
size_t M, size_t N, float alpha,
gpudata **A, size_t *offA, size_t lda,
gpudata **x, size_t *offX, size_t incX,
float beta, gpudata **y, size_t *offY, size_t incY,
size_t batchCount, int flags) {
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(A[0])->blas_ops->hgemvBatch(
order, transA, M, N, alpha, A, offA, lda, x, offX, incX,
beta, y, offY, incY, batchCount, flags);
}
int gpublas_sgemvBatch(
cb_order order, cb_transpose transA,
size_t M, size_t N, float alpha,
gpudata **A, size_t *offA, size_t lda,
gpudata **x, size_t *offX, size_t incX,
float beta, gpudata **y, size_t *offY, size_t incY,
size_t batchCount, int flags) {
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(A[0])->blas_ops->sgemvBatch(
order, transA, M, N, alpha, A, offA, lda, x, offX, incX,
beta, y, offY, incY, batchCount, flags);
}
int gpublas_dgemvBatch(
cb_order order, cb_transpose transA,
size_t M, size_t N, double alpha,
gpudata **A, size_t *offA, size_t lda,
gpudata **x, size_t *offX, size_t incX,
double beta, gpudata **y, size_t *offY, size_t incY,
size_t batchCount, int flags) {
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(A[0])->blas_ops->dgemvBatch(
order, transA, M, N, alpha, A, offA, lda, x, offX, incX,
beta, y, offY, incY, batchCount, flags);
}
int gpublas_hgerBatch(cb_order order, size_t M, size_t N, float alpha,
gpudata **x, size_t *offX, size_t incX,
gpudata **y, size_t *offY, size_t incY,
gpudata **A, size_t *offA, size_t lda,
size_t batchCount, int flags) {
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(x[0])->blas_ops->hgerBatch(
order, M, N, alpha, x, offX, incX, y, offY, incY,
A, offA, lda, batchCount, flags);
}
int gpublas_sgerBatch(cb_order order, size_t M, size_t N, float alpha,
gpudata **x, size_t *offX, size_t incX,
gpudata **y, size_t *offY, size_t incY,
gpudata **A, size_t *offA, size_t lda,
size_t batchCount, int flags) {
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(x[0])->blas_ops->sgerBatch(
order, M, N, alpha, x, offX, incX, y, offY, incY,
A, offA, lda, batchCount, flags);
}
int gpublas_dgerBatch(cb_order order, size_t M, size_t N, double alpha,
gpudata **x, size_t *offX, size_t incX,
gpudata **y, size_t *offY, size_t incY,
gpudata **A, size_t *offA, size_t lda,
size_t batchCount, int flags) {
if (batchCount == 0) return GA_NO_ERROR;
return gpudata_context(x[0])->blas_ops->dgerBatch(
order, M, N, alpha, x, offX, incX, y, offY, incY,
A, offA, lda, batchCount, flags);
}