summaryrefslogtreecommitdiff
path: root/external/clBLAS/src/library/blas/generic/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'external/clBLAS/src/library/blas/generic/common.c')
-rw-r--r--external/clBLAS/src/library/blas/generic/common.c905
1 files changed, 0 insertions, 905 deletions
diff --git a/external/clBLAS/src/library/blas/generic/common.c b/external/clBLAS/src/library/blas/generic/common.c
deleted file mode 100644
index 477a01bb..00000000
--- a/external/clBLAS/src/library/blas/generic/common.c
+++ /dev/null
@@ -1,905 +0,0 @@
-/* ************************************************************************
- * Copyright 2013 Advanced Micro Devices, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ************************************************************************/
-
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <clBLAS.h>
-#include <clkern.h>
-#include <cltypes.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#include "clblas-internal.h"
-
-#if defined(DUMP_CLBLAS_KERNELS) && !defined(KEEP_CLBLAS_KERNEL_SOURCES)
-#define KEEP_CLBLAS_KERNEL_SOURCES
-#endif
-
-int clblasInitialized = 0;
-CLBlasSolvers clblasSolvers[BLAS_FUNCTIONS_NUMBER];
-struct KernelCache *clblasKernelCache = NULL;
-
-enum {
- BUILD_LOG_SIZE = 65536
-};
-
-static __inline void
-storeErrorCode(cl_int *error, cl_int code)
-{
- if (error != NULL) {
- *error = code;
- }
-}
-
-#ifndef PRINT_BUILD_ERRORS
- #define PRINT_BUILD_ERRORS
-#endif
-
-#ifdef PRINT_BUILD_ERRORS
-
-static char
-*allocBuildLog(void)
-{
- char *log;
-
- log = malloc(BUILD_LOG_SIZE);
- if (log) {
- log[0] = '\0';
- }
-
- return log;
-}
-
-static void
-freeBuildLog(char *buildLog)
-{
- free(buildLog);
-}
-
-static void
-printBuildError(
- cl_int error,
- cl_device_id device,
- SolverKgen kgen,
- const SubproblemDim *dims,
- const PGranularity *pgran,
- const CLBLASKernExtra *kextra,
- const char *source,
- const char *buildLog)
-{
- char name[128];
- char dimStr[1024];
- char pgranStr[1024];
- char *p;
- MemoryPattern *mempat = NULL;
- unsigned int i, j;
- const char *s;
-
- name[0] = '\0';
- clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(name), name, NULL);
-
- // lookup memory pattern
- s = NULL;
- for (i = 0; i < BLAS_FUNCTIONS_NUMBER; i++) {
- for (j = 0; j < clblasSolvers[i].nrPatterns; j++) {
- mempat = &clblasSolvers[i].memPatterns[j];
- if (kgen == mempat->sops->genKernel) {
- s = kernelTypeString(kextra->kernType);
- break;
- }
- }
- if (s != NULL) {
- break;
- }
- }
-
- // sprintf Subproblem dimensions
- p = dimStr;
- for (i = 0; i < mempat->nrLevels; i++) {
- p = sprintfGranulation(p, dims, i);
- strcat(p, "; ");
- p += strlen(p);
- }
-
- // sprintf data parallelism granularity
- sprintf(pgranStr, "pgran->wgDim = %d, pgran->wgSize[0] = %u, "
- "pgran->wgSize[1] = %u, pgran->wfSize = %u",
- pgran->wgDim, pgran->wgSize[0], pgran->wgSize[1],
- pgran->wfSize);
-
- fprintf(stderr, "\n========================================================\n\n");
- fprintf(stderr, "AN INTERNAL KERNEL BUILD ERROR OCCURRED!\n");
- fprintf(stderr, "device name = %s\n", name);
- fprintf(stderr, "error = %d\n", error);
- fprintf(stderr, "memory pattern = %s, %s kernel generator\n", mempat->name, s);
- fprintf(stderr, "Subproblem dimensions: %s\n", dimStr);
- fprintf(stderr, "Parallelism granularity: %s\n", pgranStr);
- fprintf(stderr, "Kernel extra flags: %u\n", kextra->flags);
- fprintf(stderr, "Source:\n\n%s\n\n", source);
- fprintf(stderr, "--------------------------------------------------------\n\n");
- if (buildLog) {
- fprintf(stderr, "Build log:\n\n%s\n", buildLog);
- }
- else {
- fprintf(stderr, "Build log is unavailable\n");
- }
- fprintf(stderr, "========================================================\n\n");
-}
-
-#else /* PRINT_BUILD_ERRORS */
-
-static __inline char*
-allocBuildLog(void)
-{
- /* stub, do nothing */
- return NULL;
-}
-
-#define freeBuildLog(log) /* stub, do nothing */
-#define printBuildError(error, device, kgen, \
- dims, pgran, kextra, source, buildLog) /* stub, do nothing */
-
-#endif /* !PRINT_BUILD_ERRORS */
-
-static void
-extraDtor(struct Kernel *kernel)
-{
- if (kernel->extra != NULL) {
- free(kernel->extra);
- kernel->extra = NULL;
- }
-}
-
-static char
-*sprintfDim(
- char *buf,
- size_t dim,
- const char *dimName,
- int level,
- bool first)
-{
- if (!first) {
- strcat(buf, ", ");
- buf += strlen(buf);
- }
- if (dim == SUBDIM_UNUSED) {
- sprintf(buf, "dims[%d].%s = SUBDIM_UNUSED", level, dimName);
- }
- else {
- sprintf(buf, "dims[%d].%s = %lu", level, dimName, dim);
- }
-
- buf += strlen(buf);
-
- return buf;
-}
-
-const char VISIBILITY_HIDDEN
-*kernelTypeString(CLBlasKernelType ktype)
-{
- switch (ktype) {
- case CLBLAS_COMPUTING_KERNEL:
- return "computing";
- case CLBLAS_PREP_A_KERNEL:
- return "preparative for matrix A";
- case CLBLAS_PREP_B_KERNEL:
- return "preparative for matrix B";
- default:
- return NULL;
- }
-}
-
-/*
- * Assign a scalar multiplied on a matrix a kernel argument
- */
-void VISIBILITY_HIDDEN
-assignScalarKarg(KernelArg *arg, const void *value, DataType dtype)
-{
- arg->typeSize = dtypeSize(dtype);
- memcpy(arg->arg.data, value, arg->typeSize);
-}
-
-void VISIBILITY_HIDDEN
-calcGlobalThreads(
- size_t globalThreads[2],
- const SubproblemDim *wgDim,
- const PGranularity *pgran,
- size_t M,
- size_t N)
-{
- globalThreads[1] = 1;
-
- if ((wgDim->itemX != SUBDIM_UNUSED) &&
- (wgDim->itemY != SUBDIM_UNUSED)) {
-
- size_t groupWorkX, groupWorkY;
- size_t nrGroupsX, nrGroupsY;
- int nrDims;
-
- groupWorkX = wgDim->itemX;
- groupWorkY = wgDim->itemY;
-
- nrGroupsX = N / groupWorkX;
- if (N % groupWorkX) {
- nrGroupsX++;
- }
-
- nrGroupsY = M / groupWorkY;
- if (M % groupWorkY) {
- nrGroupsY++;
- }
-
- nrDims = (pgran == NULL) ? 1 : pgran->wgDim;
- if (nrDims == 1) {
- globalThreads[0] = nrGroupsX * nrGroupsY;
- }
- else {
- globalThreads[0] = nrGroupsY;
- globalThreads[1] = nrGroupsX;
- }
- }
- else {
- size_t totalWork, groupWork;
-
- if (wgDim->itemX != SUBDIM_UNUSED) {
- totalWork = N;
- groupWork = wgDim->itemX;
- }
- else {
- totalWork = M;
- groupWork = wgDim->itemY;
- }
-
- globalThreads[0] = totalWork / groupWork;
- if (totalWork % groupWork) {
- globalThreads[0]++;
- }
- }
-
- if (pgran != NULL) {
- globalThreads[0] *= pgran->wgSize[0];
- globalThreads[1] *= pgran->wgSize[1];
- }
-}
-
-cl_int VISIBILITY_HIDDEN
-getKernelContext(cl_kernel kernel, cl_context *context)
-{
- cl_int err;
- cl_context ctx;
-
- err = clGetKernelInfo(kernel, CL_KERNEL_CONTEXT,
- sizeof(cl_context), &ctx, NULL);
- if (err != CL_SUCCESS)
- return err;
- if (context != NULL)
- *context = ctx;
- return err;
-}
-
-cl_int VISIBILITY_HIDDEN
-getQueueContext(cl_command_queue queue, cl_context *context)
-{
- cl_int err;
- cl_context ctx;
-
- err = clGetCommandQueueInfo(queue, CL_QUEUE_CONTEXT,
- sizeof(cl_context), &ctx, NULL);
- if (err != CL_SUCCESS)
- return err;
- if (context != NULL)
- *context = ctx;
- return err;
-}
-
-cl_int VISIBILITY_HIDDEN
-getQueueDevice(cl_command_queue queue, cl_device_id *device)
-{
- cl_int err;
- cl_device_id dev;
-
- err = clGetCommandQueueInfo(queue, CL_QUEUE_DEVICE,
- sizeof(cl_device_id), &dev, NULL);
- if (err != CL_SUCCESS)
- return err;
- if (device != NULL)
- *device = dev;
- return err;
-}
-
-cl_int VISIBILITY_HIDDEN
-getQueueProperties(
- cl_command_queue queue,
- cl_command_queue_properties *props)
-{
- cl_int err;
- cl_command_queue_properties p;
-
- err = clGetCommandQueueInfo(queue, CL_QUEUE_PROPERTIES,
- sizeof(cl_command_queue_properties), &p, NULL);
- if (err != CL_SUCCESS)
- return err;
- if (props != NULL)
- *props = p;
- return err;
-}
-
-Kernel VISIBILITY_HIDDEN
-*loadKernel( const unsigned char** buffer,
- size_t sizeBuffer,
- KernelKey *key,
- const CLBLASKernExtra *extra,
- cl_int *error)
-
-{
- cl_int status = CL_SUCCESS;
- Kernel* kernel;
-
- kernel = allocKernel();
- if (kernel == NULL) {
- return NULL;
- }
-
- kernel->program = createClProgramWithBinary(key->context,
- key->device,
- (unsigned char*)*buffer,
- sizeBuffer,
- &status);
- if (status == CL_SUCCESS) {
- kernel->extraSize = sizeof(CLBLASKernExtra);
- kernel->extra = calloc(1, kernel->extraSize);
- *(CLBLASKernExtra*)(kernel->extra) = *extra;
- kernel->dtor = extraDtor;
- kernel->noSource = 1;
- }
- else {
- putKernel(NULL, kernel);
- storeErrorCode(error, status);
- kernel = NULL;
- }
-
- return kernel;
-}
-
-#if !defined(DUMP_CLBLAS_KERNELS)
-
-/*
- * Drop the program's source so as to consume memory as few as possible
- * at caching
- */
-static cl_int
-dropProgramSource(cl_program *program, cl_context ctx, cl_device_id devID)
-{
- size_t size;
- unsigned char *bin;
- cl_program p = *program;
- cl_int err;
-
- size = getProgramBinarySize(p);
- bin = getProgramBinary(p);
-
- /*
- * Don't release the original program until a new one is created
- * in order to retain its own reference to the context if it is
- * released by user
- */
- p = createClProgramWithBinary(ctx, devID, bin, size, &err);
- if (err == CL_SUCCESS) {
- clReleaseProgram(*program);
- *program = p;
- }
-
- free(bin);
-
- return err;
-}
-
-#endif /* !DUMP_CLBLAS_KERNELS */
-
-Kernel
-*makeKernel(
- cl_device_id device,
- cl_context context,
- SolverKgen kernelGenerator,
- const SubproblemDim *dims,
- const PGranularity *pgran,
- const CLBLASKernExtra *extra,
- const char *buildOpts,
- cl_int *error)
-{
-
- cl_int err;
- char *source;
- ssize_t size;
- Kernel *kernel;
- char *log;
-
- #ifdef DEBUG_2
- printf("Make kernel called\n");
- printf("x : %d, y : %d, itemX: %d, itemY: %d\n", dims->x, dims->y, dims->itemX, dims->itemY);
- printf("PG : wgSize[0] : %d, wgSize[1] : %d, wfSize: %d\n", pgran->wgSize[0], pgran->wgSize[1], pgran->wfSize);
- #endif
-
- size = kernelGenerator(NULL, 0, dims, pgran, (void*)extra);
- if (size < 0) {
- storeErrorCode(error, CL_OUT_OF_HOST_MEMORY);
- return NULL;
- }
- source = calloc(1, size);
- if (source == NULL) {
- storeErrorCode(error, CL_OUT_OF_HOST_MEMORY);
- return NULL;
- }
- if (kernelGenerator(source, size, dims, pgran, (void*)extra) != size) {
- free(source);
- storeErrorCode(error, CL_OUT_OF_HOST_MEMORY);
- return NULL;
- }
-
- kernel = allocKernel();
- if (kernel == NULL) {
- free(source);
- storeErrorCode(error, CL_OUT_OF_HOST_MEMORY);
- return NULL;
- }
-
- log = allocBuildLog();
-
- //#define DEBUG_2
- #ifdef DEBUG_2
- printf("Build Options used %s \n", buildOpts);
- printf("Source kernel used %s \n", source);
- #endif
- #undef DEBUG_2
-
- kernel->program = buildClProgram(source, buildOpts, context, device,
- log, BUILD_LOG_SIZE, &err);
- if (err != CL_SUCCESS) {
- printBuildError(err, device, kernelGenerator, dims,
- pgran, extra, source, log);
- freeBuildLog(log);
- putKernel(NULL, kernel);
- free(source);
- storeErrorCode(error, err);
- return NULL;
- }
- else
- {
- // #define DEBUG_2
- #ifdef DEBUG_2
- printf("Kernel compilation succeeded\n");
- #endif
- #undef DEBUG_2
- }
-
- freeBuildLog(log);
- free(source);
-
-#if !defined(KEEP_CLBLAS_KERNEL_SOURCES)
- if (err == CL_SUCCESS) {
- err = dropProgramSource(&kernel->program, context, device);
- kernel->noSource = 1;
- }
-#endif /* !DUMP_CLBLAS_KERNELS */
-
- if (err != CL_SUCCESS) {
- putKernel(NULL, kernel);
- storeErrorCode(error, err);
- return NULL;
- }
-
- kernel->extraSize = sizeof(CLBLASKernExtra);
- kernel->extra = calloc(1, kernel->extraSize);
- *(CLBLASKernExtra*)(kernel->extra) = *extra;
- kernel->dtor = extraDtor;
-
- storeErrorCode(error, CL_SUCCESS);
-
- return kernel;
-
-}
-
-void
-setupBuildOpts(
- char opts[BUILD_OPTS_MAXLEN],
- cl_device_id devID,
- MemoryPattern *mempat)
-{
- TargetDevice target;
-
- target.id = devID;
- identifyDevice(&target);
- opts[0] = '\0';
-
-#if !defined NDEBUG
- // Nvidia runtime does not appear to support the -g flag, at least in their OpenCL v1.1 runtime
- if( target.ident.vendor != VENDOR_NVIDIA )
- addBuildOpt( opts, BUILD_OPTS_MAXLEN, "-g" );
-#endif /* NDEBUG */
-
- if (target.ident.vendor == VENDOR_NVIDIA &&
- !strcmp(mempat->name, "2-staged cached global memory based "
- "block trsm")) {
-
- addBuildOpt(opts, BUILD_OPTS_MAXLEN, "-cl-opt-disable");
- }
-}
-
-void addBuildOpt(
- char * opts,
- size_t len,
- const char * option)
-{
- size_t l = strlen(opts);
-
- if (l > 0 && !isspace(opts[l-1]) && l+1 < len) {
- opts[l] = ' ';
- opts[l+1] = '\0';
- l++;
- }
-
- strncat(opts, option, len - l - 1);
-}
-
-
-char VISIBILITY_HIDDEN
-*sprintfGranulation(char *buf, const SubproblemDim *dim, int level)
-{
- buf = sprintfDim(buf, dim[level].itemY, "itemY", level, true);
- buf = sprintfDim(buf, dim[level].itemX, "itemX", level, false);
- buf = sprintfDim(buf, dim[level].y, "y", level, false);
- buf = sprintfDim(buf, dim[level].x, "x", level, false);
- buf = sprintfDim(buf, dim[level].bwidth, "bwidth", level, false);
- strcat(buf, "; ");
- buf += strlen(buf);
-
- return buf;
-}
-
-clblasStatus VISIBILITY_HIDDEN
-checkMatrixSizes(
- DataType dtype,
- clblasOrder order,
- clblasTranspose transA,
- size_t M,
- size_t N,
- cl_mem A,
- size_t offA,
- size_t lda, // lda is passed as zero for packed matrices
- ErrorCodeSet err )
-{
- size_t memSize, matrSize, tsize, memUsed;
- size_t unusedTail = 0;
- bool tra;
-
- if ((M == 0) || (N == 0)) {
- return clblasInvalidDim;
- }
-
- tsize = dtypeSize(dtype);
- tra = (order == clblasRowMajor && transA != clblasNoTrans) ||
- (order == clblasColumnMajor && transA == clblasNoTrans);
-
- if( lda > 0 ) // For Non-packed matrices
- {
- if (tra) {
- if (lda < M) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInvalidLeadDimA;
- case B_MAT_ERRSET:
- return clblasInvalidLeadDimB;
- case C_MAT_ERRSET:
- return clblasInvalidLeadDimC;
- default:
- return clblasNotImplemented;
- }
- }
- matrSize = ((N - 1) * lda + M) * tsize;
- unusedTail = ( lda - N ) * tsize;
- }
- else {
- if (lda < N) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInvalidLeadDimA;
- case B_MAT_ERRSET:
- return clblasInvalidLeadDimB;
- case C_MAT_ERRSET:
- return clblasInvalidLeadDimC;
- default:
- return clblasNotImplemented;
- }
- }
- matrSize = ((M - 1) * lda + N) * tsize;
- unusedTail = ( lda - M ) * tsize;
- }
- }
- else { // For the case of packed matrices
- matrSize = ((M * (N+1)) / 2) * tsize;
- }
-
- offA *= tsize;
-
- if (clGetMemObjectInfo(A, CL_MEM_SIZE, sizeof(memSize), &memSize, NULL) !=
- CL_SUCCESS) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInvalidMatA;
- case B_MAT_ERRSET:
- return clblasInvalidMatB;
- case C_MAT_ERRSET:
- return clblasInvalidMatC;
- default:
- return clblasNotImplemented;
- }
- }
-
- // It is possible to allocate a buffer, and set up lda & ldb such that it looks like it will access outside of the allocated buffer, but if
- // M & N are kept small enough, no out of bounds access will occur. Compensate for the offset values and the unused tail memory caused by lda & ldb.
- // Ex: BuffSize=6 floats, M=1, N=2, lda=ldb=3, offA = 0, offB = 2 : |A[0,0]|unused|B[0,0]|A[0,1]|unused|B[0,1]|
- memUsed = (( offA + matrSize ) > unusedTail) ? offA + matrSize - unusedTail: 0;
-
- // Note: this is a hack to get the xsymm tests to work.
- // TODO: Find out why "memUsed" is set to 0 in some cases!
- memUsed = offA + matrSize;
- //printf("%lu required but found %lu\n", memUsed/tsize, memSize/tsize);
-
- if (( memUsed > memSize ) || (offA + matrSize < offA)) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInsufficientMemMatA;
- case B_MAT_ERRSET:
- return clblasInsufficientMemMatB;
- case C_MAT_ERRSET:
- return clblasInsufficientMemMatC;
- default:
- return clblasNotImplemented;
- }
- }
-
- return clblasSuccess;
-}
-
-
-clblasStatus VISIBILITY_HIDDEN
-checkBandedMatrixSizes(
- DataType dtype,
- clblasOrder order,
- clblasTranspose transA,
- size_t M,
- size_t N,
- size_t KL,
- size_t KU,
- cl_mem A,
- size_t offA,
- size_t lda,
- ErrorCodeSet err )
-{
- size_t memSize, matrSize, tsize, K, memUsed;
- size_t unusedTail = 0;
- bool tra;
-
- if ((M == 0) || (N == 0)) {
- return clblasInvalidDim;
- }
-
- tsize = dtypeSize(dtype);
- K = KL + KU + 1;
- tra = (order == clblasRowMajor && transA != clblasNoTrans) ||
- (order == clblasColumnMajor && transA == clblasNoTrans);
-
- if (lda < K) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInvalidLeadDimA;
- case B_MAT_ERRSET:
- return clblasInvalidLeadDimB;
- case C_MAT_ERRSET:
- return clblasInvalidLeadDimC;
- default:
- return clblasNotImplemented;
- }
- }
-
- if (tra) {
- matrSize = ((N - 1) * lda + K) * tsize;
- unusedTail = ( lda - N ) * tsize;
- }
- else {
- matrSize = ((M - 1) * lda + K) * tsize;
- unusedTail = ( lda - M ) * tsize;
- }
-
- offA *= tsize;
-
- if (clGetMemObjectInfo(A, CL_MEM_SIZE, sizeof(memSize), &memSize, NULL) !=
- CL_SUCCESS) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInvalidMatA;
- case B_MAT_ERRSET:
- return clblasInvalidMatB;
- case C_MAT_ERRSET:
- return clblasInvalidMatC;
- default:
- return clblasNotImplemented;
- }
- }
-
- // It is possible to allocate a buffer, and set up lda & ldb such that it looks like it will access outside of the allocated buffer, but if
- // M & N are kept small, no out of bounds access will occur. Compensate for the offset values and the unused tail memory caused by lda & ldb.
- // Ex: BuffSize=6 floats, M=1, N=2, lda=ldb=3, offA = 0, offB = 2 : |A[0,0]|unused|B[0,0]|A[0,1]|unused|B[0,1]|
- memUsed = (( offA + matrSize ) > unusedTail) ? offA + matrSize - unusedTail: 0;
- if (memUsed > memSize) {
- switch( err )
- {
- case A_MAT_ERRSET:
- return clblasInsufficientMemMatA;
- case B_MAT_ERRSET:
- return clblasInsufficientMemMatB;
- case C_MAT_ERRSET:
- return clblasInsufficientMemMatC;
- default:
- return clblasNotImplemented;
- }
- }
-
- return clblasSuccess;
-}
-
-clblasStatus VISIBILITY_HIDDEN
-checkVectorSizes(
- DataType dtype,
- size_t N,
- cl_mem x,
- size_t offx,
- int incx,
- ErrorCodeSet err )
-{
- size_t memSize, sizev;
- size_t tsize;
-
- if (N == 0) {
- return clblasInvalidDim;
- }
-
- if (incx == 0) {
- switch( err )
- {
- case X_VEC_ERRSET:
- return clblasInvalidIncX;
- case Y_VEC_ERRSET:
- return clblasInvalidIncY;
- default:
- return clblasNotImplemented;
- }
- }
-
- if (clGetMemObjectInfo(x, CL_MEM_SIZE, sizeof(memSize), &memSize, NULL) !=
- CL_SUCCESS) {
- switch( err )
- {
- case X_VEC_ERRSET:
- return clblasInvalidVecX;
- case Y_VEC_ERRSET:
- return clblasInvalidVecY;
- default:
- return clblasNotImplemented;
- }
- }
-
- tsize = dtypeSize(dtype);
- sizev = ((N - 1) * abs(incx) + 1) * tsize;
- offx *= tsize;
-
- if ((offx + sizev > memSize) || (offx + sizev < offx)) {
- switch( err )
- {
- case X_VEC_ERRSET:
- return clblasInsufficientMemVecX;
- case Y_VEC_ERRSET:
- return clblasInsufficientMemVecY;
- default:
- return clblasNotImplemented;
- }
- }
-
- return clblasSuccess;
-}
-
-clblasStatus
-checkMemObjects(
- cl_mem A,
- cl_mem B,
- cl_mem C,
- bool checkC,
- ErrorCodeSet errA,
- ErrorCodeSet errB,
- ErrorCodeSet errC )
-{
- cl_mem_object_type mobjType = 0;
-
- if (!clGetMemObjectInfo(A, CL_MEM_TYPE, sizeof(mobjType), &mobjType, NULL) &&
- (mobjType != CL_MEM_OBJECT_BUFFER)) {
- switch( errA )
- {
- case A_MAT_ERRSET:
- return clblasInvalidMatA;
- case B_MAT_ERRSET:
- return clblasInvalidMatB;
- case C_MAT_ERRSET:
- return clblasInvalidMatC;
- case X_VEC_ERRSET:
- return clblasInvalidVecX;
- case Y_VEC_ERRSET:
- return clblasInvalidVecY;
- default:
- return clblasNotImplemented;
- }
- }
-
- mobjType = 0;
- if (!clGetMemObjectInfo(B, CL_MEM_TYPE, sizeof(mobjType), &mobjType, NULL) &&
- (mobjType != CL_MEM_OBJECT_BUFFER)) {
- switch( errB )
- {
- case A_MAT_ERRSET:
- return clblasInvalidMatA;
- case B_MAT_ERRSET:
- return clblasInvalidMatB;
- case C_MAT_ERRSET:
- return clblasInvalidMatC;
- case X_VEC_ERRSET:
- return clblasInvalidVecX;
- case Y_VEC_ERRSET:
- return clblasInvalidVecY;
- default:
- return clblasNotImplemented;
- }
- }
-
- mobjType = 0;
- if (checkC && !clGetMemObjectInfo(C, CL_MEM_TYPE, sizeof(mobjType),
- &mobjType, NULL) &&
- (mobjType != CL_MEM_OBJECT_BUFFER)) {
- switch( errC )
- {
- case A_MAT_ERRSET:
- return clblasInvalidMatA;
- case B_MAT_ERRSET:
- return clblasInvalidMatB;
- case C_MAT_ERRSET:
- return clblasInvalidMatC;
- case X_VEC_ERRSET:
- return clblasInvalidVecX;
- case Y_VEC_ERRSET:
- return clblasInvalidVecY;
- default:
- return clblasNotImplemented;
- }
- }
-
- return clblasSuccess;
-}