diff options
Diffstat (limited to 'external/clBLAS/src/library/tools/tune/toolslib.c')
-rw-r--r-- | external/clBLAS/src/library/tools/tune/toolslib.c | 539 |
1 files changed, 0 insertions, 539 deletions
diff --git a/external/clBLAS/src/library/tools/tune/toolslib.c b/external/clBLAS/src/library/tools/tune/toolslib.c deleted file mode 100644 index fc55b8a4..00000000 --- a/external/clBLAS/src/library/tools/tune/toolslib.c +++ /dev/null @@ -1,539 +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 <signal.h> - -#include "storage_data.h" -#include "toolslib.h" -#include "devinfo.h" -#include "assert.h" -#include "clblas_stddef.h" -#include "mutex.h" - - -// The array size is the total number devices on all platforms -static StorageCacheImpl* storageCacheArray = NULL; -// Number of items in storage cache array -// is the number of unique devices. -static unsigned int storageCacheArrayCount = 0; - -static mutex_t *storageCacheLock = NULL; - - -static void -clearPatternsNumber(BlasFunctionInfo *funcInfo) -{ - int i; - - for (i = 0; i < BLAS_FUNCTIONS_NUMBER; i++) { - funcInfo[i].numPatterns = 0; - } -} - -char* -getDevName(TargetDevice* tdev) -{ - size_t size; - char* name; - - clGetDeviceInfo(tdev->id, CL_DEVICE_NAME, 0, NULL, &size); - name = malloc(size * sizeof(char)); - clGetDeviceInfo(tdev->id, CL_DEVICE_NAME, size, name, NULL); - - return name; -} - -void -initCLDeviceInfoRec(TargetDevice* tdev, DeviceInfo *devInfo) -{ - cl_int status = 0; - cl_uint bDouble; - cl_device_id devID = tdev->id; - devInfo->tdev = tdev; - - status = clGetDeviceInfo(devID, - CL_DEVICE_MAX_COMPUTE_UNITS, - sizeof(cl_uint), - &(devInfo->nrComputeUnits), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_GLOBAL_MEM_SIZE, - sizeof(cl_ulong), - &(devInfo->globalSize), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_LOCAL_MEM_SIZE, - sizeof(cl_ulong), - &(devInfo->ldsSize), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_MAX_MEM_ALLOC_SIZE, - sizeof(cl_ulong), - &(devInfo->maxMemAllocSize), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, - sizeof(cl_uint), - &(devInfo->alignment), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, - sizeof(cl_uint), - &(devInfo->workItemSizesDim), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_MAX_WORK_ITEM_SIZES, - sizeof(size_t) * devInfo->workItemSizesDim, - &(devInfo->workItemSizes), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_MAX_WORK_GROUP_SIZE, - sizeof(size_t) , - &(devInfo->workGroupSizes), - NULL); - - status = clGetDeviceInfo(devID, - CL_DEVICE_ADDRESS_BITS, - sizeof(cl_uint), - &(devInfo->addressBits), - NULL); - - - - status = clGetDeviceInfo(devID, - CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, - sizeof(cl_uint), - &bDouble, - NULL); - devInfo->nativeDouble = deviceHasNativeDouble(devID, &status); - - // Values are put randomly. - //TODO To use the correct data - devInfo->nrStreamCores = 1; /* Number of stream cores per Compute Unit */ - devInfo->wavefront = 64; /* Number of work-items executed in parallel on hardware */ - devInfo->nativeComplex = true; /* Specifies whether device supports complex float */ -} - -bool -initReadingData(StorageCacheImpl* cacheImpl, TargetDevice* tdev ) -{ - char* devName; - DeviceInfo defInf; - - initCLDeviceInfoRec(tdev, &defInf); - initBlasFuncionData(cacheImpl->functionInfo); - initCacheData(cacheImpl->functionInfo, &defInf); - - cacheImpl->endFile = calcOffset(cacheImpl->functionInfo); - devName = getDevName(tdev); - cacheImpl->fpath = createFullPatch(devName, false); - cacheImpl->fpath_tmp = createFullPatch(devName, true); - free(devName); - if (cacheImpl->fpath == NULL) { - return false; - } - - return true; -} - -int -getGranularityInfo( - // In - TargetDevice* tdev, - const char* pattName, - const DataType dt, - const KernelExtraFlags kflag, - int dim, // - // Out - SubproblemDim *sdim, - PGranularity *pgran, - double *time) -{ - BlasParamInfo* bParam; - int ret = GF_ERROR; - int r; - StorageCacheImpl* cache = getStorageCache(tdev, false); - - if (cache == NULL) { - return ret; - } - - bParam = findParam(cache, pattName, dt, kflag, dim); - if (bParam != NULL) { - r = bParam->sstatus != SS_CORRECT_DATA; - if (!r) { - memcpy(sdim, bParam->sDim, sizeof(SubproblemDim)* MAX_SUBDIMS); - memcpy(pgran,&bParam->pGran, sizeof(PGranularity)); - *time = bParam->time; - ret = GF_SUCCESS; - } - else if (r == -1) { - ret = GF_CORRUPT_FILE; - //printCorruptionError(devID); - } - } - - return ret; -} - -int -getKernelInfo( - TargetDevice* devID, - const char* pattName, - const DataType dt, - const KernelExtraFlags kflag, - int dim, - unsigned char** buffer, - size_t* sizeBuffer) -{ - BlasParamInfo* bParam; - int ret = GF_ERROR; - StorageCacheImpl* cache = getStorageCache(devID, false); - - if (cache == NULL) { - return ret; - } - - memset(buffer, 0, sizeof(char*) * MAX_CLBLAS_KERNELS_PER_STEP); - memset(sizeBuffer, 0, sizeof(size_t) * MAX_CLBLAS_KERNELS_PER_STEP); - if (cache->isPopulate) { - bParam = findParam(cache, pattName, dt, kflag, dim); - if (bParam != NULL) { - loadKernelsFromFile(cache, bParam, buffer, sizeBuffer); - if (buffer[0] == NULL) { - ret = GF_SUCCESS; - } - } - } - return ret; -} -/******************************************************************************/ - -void -destroyStorageCache(void) -{ - unsigned int i; - StorageCacheImpl* curCache; - - if(storageCacheArray != NULL) { - for (i = 0; i < storageCacheArrayCount; i++) { - curCache = &storageCacheArray[i]; - - if (curCache != NULL) { - destroyData(curCache->functionInfo); - - if (curCache->fpath != NULL) { - free(curCache->fpath); - } - if (curCache->fpath_tmp != NULL) { - free(curCache->fpath_tmp); - } - - curCache->isPopulate = false; - } - } - - storageCacheArrayCount = 0; - - mutexDestroy(storageCacheLock); - storageCacheLock = NULL; - - free(storageCacheArray); - storageCacheArray = NULL; - } -} - -BlasFunctionInfo* -getBlasFunctionInfo(TargetDevice* tdev, int func) -{ - StorageCacheImpl* impl = getStorageCache(tdev, false); - BlasFunctionInfo* ret = NULL; - - if (impl == NULL) { - return NULL; - } - - if (func >= 0 && func < BLAS_FUNCTIONS_NUMBER) { - ret = &impl->functionInfo[func]; - } - return ret; -} - - -#define CHECK_(X) \ - res = X; \ - if (!res) { \ - printf("ERROR %s\n", #X); \ - /*raise(SIGTRAP);*/ \ - } - -void checkFILE(TargetDevice* tdev, BlasFunctionInfo* fiArr) -{ - StorageCacheImpl* impl; - bool res; - int func; - unsigned int patt; - unsigned int extra; - unsigned int param; - - impl = getStorageCache(tdev, false); - if (impl == NULL) { - return; - } - - for (func = 0; func < BLAS_FUNCTIONS_NUMBER; func++) { - BlasFunctionInfo* cfi = &impl->functionInfo[func]; - BlasFunctionInfo* fi = &fiArr[func]; - - CHECK_(cfi->funcNo == fi->funcNo); - CHECK_(cfi->numPatterns == fi->numPatterns); - CHECK_(cfi->maskForTuningsKernel == fi->maskForTuningsKernel); - CHECK_(cfi->maskForUniqueKernels == fi->maskForUniqueKernels); - CHECK_(cfi->defaultPattern == fi->defaultPattern); - CHECK_(cfi->defaultPattern == fi->defaultPattern); - CHECK_(strcmp(cfi->name, fi->name) == 0); - //CHECK_(cfi-> == fi->) - for (patt = 0; patt < fi->numPatterns; ++patt) { - BlasPatternInfo* cpi = &cfi->pattInfo[patt]; - BlasPatternInfo* pi = &fi->pattInfo[patt]; - MemoryPattern* cmp = &cfi->pattern[patt]; - MemoryPattern* mp = &fi->pattern[patt]; - - CHECK_(cpi->numExtra == pi->numExtra ); - CHECK_(cpi->numTuneExtra == pi->numTuneExtra); - CHECK_(cpi->offset == pi->offset); - CHECK_(cpi->size == pi->size); - //CHECK_(cpi->sstatus == pi->sstatus); - CHECK_(cpi->pattNo == pi->pattNo); - CHECK_(strcmp(cpi->name, pi->name) == 0); - - CHECK_(cmp->nrLevels == mp->nrLevels ); - CHECK_(cmp->cuLevel == mp->cuLevel ); - CHECK_(cmp->thLevel == mp->thLevel ); - CHECK_(cmp->sops == mp->sops ); - CHECK_(cmp->extra == mp->extra ); - CHECK_(strcmp(cmp->name, mp->name) == 0); - - for (extra = 0; extra < pi->numExtra; ++extra) { - BlasExtraInfo* cei = &cpi->extra[extra]; - BlasExtraInfo* ei = &pi->extra[extra]; - - CHECK_(cei->numParam == ei->numParam); - CHECK_(cei->dtype == ei->dtype); - CHECK_(cei->flags == ei->flags); - CHECK_(cei->vecLen == ei->vecLen); - CHECK_(cei->isUseForTunning == ei->isUseForTunning); - - CHECK_(cei->offset == ei->offset); - CHECK_(cei->size == ei->size); - CHECK_(cei->sstatus == ei->sstatus); - - - for (param = 0; param < ei->numParam; ++param) { - BlasParamInfo* cpri = &cei->param[param]; - BlasParamInfo* pri = &ei->param[param]; - - CHECK_(cpri->dim == pri->dim); - CHECK_(cpri->pGran.wfSize == pri->pGran.wfSize); - CHECK_(cpri->pGran.wgDim == pri->pGran.wgDim); - CHECK_(cpri->pGran.wgSize[0] == pri->pGran.wgSize[0]); - CHECK_(cpri->pGran.wgSize[1] == pri->pGran.wgSize[1]); - CHECK_(cpri->sDim[0].bwidth == pri->sDim[0].bwidth); - CHECK_(cpri->sDim[0].itemX== pri->sDim[0].itemX); - CHECK_(cpri->sDim[0].itemY== pri->sDim[0].itemY); - CHECK_(cpri->sDim[0].x == pri->sDim[0].x); - CHECK_(cpri->sDim[0].y == pri->sDim[0].y); - CHECK_(cpri->sDim[1].bwidth == pri->sDim[1].bwidth); - CHECK_(cpri->sDim[1].itemX== pri->sDim[1].itemX); - CHECK_(cpri->sDim[1].itemY== pri->sDim[1].itemY); - CHECK_(cpri->sDim[1].x == pri->sDim[1].x); - CHECK_(cpri->sDim[1].y == pri->sDim[1].y); - CHECK_(cpri->sDim[2].bwidth == pri->sDim[2].bwidth); - CHECK_(cpri->sDim[2].itemX== pri->sDim[2].itemX); - CHECK_(cpri->sDim[2].itemY== pri->sDim[2].itemY); - CHECK_(cpri->sDim[2].x == pri->sDim[2].x); - CHECK_(cpri->sDim[2].y == pri->sDim[2].y); - CHECK_(cpri->time == pri->time); - CHECK_(cpri->offset == pri->offset); - CHECK_(cpri->size == pri->size); - CHECK_(cpri->sstatus == pri->sstatus); - } - } - } - } -} - -bool -isDeviceEQ(DeviceIdent* dev1, DeviceIdent* dev2) -{ - bool ret = true; - - ret &= dev1->chip == dev2->chip; - ret &= dev1->family == dev2->family; - ret &= dev1->vendor == dev2->vendor; - - return ret; -} - -StorageCacheImpl* -getStorageCache(TargetDevice* tdev, bool force) -{ - unsigned int k; - StorageCacheImpl* curCache = NULL; - - assert(storageCacheArray != NULL); - assert(storageCacheLock != NULL); - - for (k = 0; k < storageCacheArrayCount; ++k) { - if (isDeviceEQ(&tdev->ident, &storageCacheArray[k].devIdent) ) { - curCache = &storageCacheArray[k]; - } - } - - assert (curCache != NULL); - - // Read data from file can be only one thread - // Work with the cached data can all threads in parallel - if (!curCache->isInit) { - mutexLock(storageCacheLock); // LOCK - - if (!curCache->isInit) { - curCache->isPopulate = false; - - if (initReadingData(curCache, tdev)) { - loadDataFromFile(curCache); - } - - curCache->isInit = true; - } - mutexUnlock(storageCacheLock); // UNLOCK - } - - // if storage cashe is empty then return NULL - if (!(curCache->isPopulate || force)) { - curCache = NULL; - } - - return curCache; -} - -unsigned int -getPlatforms(cl_platform_id **platforms) -{ - cl_int ret; - cl_uint numberPlatform; - - ret = clGetPlatformIDs(0, NULL, &numberPlatform); - - if (ret != CL_SUCCESS || numberPlatform == 0) { - return 0; - } - - *platforms = calloc(numberPlatform, sizeof(cl_platform_id)); - - if (*platforms == NULL) { - return 0; - } - - ret = clGetPlatformIDs(numberPlatform, *platforms, NULL); - return numberPlatform; -} - -void -initStorageCache(void) -{ - cl_uint numberPlatform = 0; - cl_platform_id *platforms = NULL; - cl_device_id *devices = NULL; - StorageCacheImpl* cur = NULL; - cl_int ret; - - unsigned int deviceCount = 0; - unsigned int i, j, k; - - assert (storageCacheLock == NULL); - assert (storageCacheArray == NULL); - assert (storageCacheArrayCount == 0); - - storageCacheLock = mutexInit(); - numberPlatform = getPlatforms(&platforms); - - if (numberPlatform ==0) { - return; - } - - for (i =0; i < numberPlatform; ++i) { - cl_uint dc; - - ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &dc); - if (ret == CL_SUCCESS) { - deviceCount += dc; - } - } - - storageCacheArray = calloc(deviceCount, sizeof(*storageCacheArray)); - - for (i =0; i < numberPlatform; ++i) { - cl_uint dc; - - ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &dc); - if (ret != CL_SUCCESS) { - continue; - } - - devices = calloc(dc, sizeof(*devices)); - - ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, dc, devices, NULL); - - for (j = 0; j < dc; ++ j) { - TargetDevice td; - bool isUnique = true; - - td.id = devices[j]; - identifyDevice(&td); - - for (k = 0; k < storageCacheArrayCount; ++k) { - if (isDeviceEQ(&td.ident, &storageCacheArray[k].devIdent) ) { - isUnique = false; - } - } - - if (isUnique) { - cur = &storageCacheArray[storageCacheArrayCount]; - - clearPatternsNumber(cur->functionInfo); - cur->isInit = false; - cur->devIdent.chip = td.ident.chip; - cur->devIdent.family = td.ident.family; - cur->devIdent.vendor = td.ident.vendor; - - storageCacheArrayCount++; - } - } - free(devices); - } - free (platforms); -} |