summaryrefslogtreecommitdiff
path: root/external/clBLAS/src/library/blas/gens/kprintf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'external/clBLAS/src/library/blas/gens/kprintf.cpp')
-rw-r--r--external/clBLAS/src/library/blas/gens/kprintf.cpp2435
1 files changed, 0 insertions, 2435 deletions
diff --git a/external/clBLAS/src/library/blas/gens/kprintf.cpp b/external/clBLAS/src/library/blas/gens/kprintf.cpp
deleted file mode 100644
index d5cbecb8..00000000
--- a/external/clBLAS/src/library/blas/gens/kprintf.cpp
+++ /dev/null
@@ -1,2435 +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 <kprintf.hpp>
-
-static const char *types[] = {
-"float", "float2", "float3", "float4", "float8", "float16",
- "double", "double2", "double3", "double4", "double8", "double16"
-};
-
-static const char*vloadTypes[] = {
- "vload", "vload2", "vload3", "vload4", "vload8", "vload16"
-};
-
-static const char*vstoreTypes[] = {
- "vstore", "vstore2", "vstore3", "vstore4", "vstore8", "vstore16"
-};
-
-static const char *vecIndices[] = {
- "S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
- "SA", "SB", "SC", "SD", "SE", "SF"
-};
-
-static const char *vecIndicesWithDot[] = {
- ".S0", ".S1", ".S2", ".S3", ".S4", ".S5", ".S6", ".S7", ".S8", ".S9",
- ".SA", ".SB", ".SC", ".SD", ".SE", ".SF"
-};
-
-static const char *vecComplexIndicesWithDot[] = {
- ".s01", ".s23", ".s45", ".s67", ".s89", ".sAB", ".sCD", ".sEF"
-};
-
-static const char *vectorWidthTypes[] = {
- "1", "2", "3", "4", "6", "8", "16"
-};
-
-static const char *numbers[] = {
- "0", "1", "2", "3", "4" , "5", "6" ,"7", "8", "9", "10", "11", "12", "13", "14", "15", "16"
-};
-
-//#define MUL_SCALAR_UNROLL
-//#define DIV_SCALAR_UNROLL
-
-
-kprintf::fmt_t kprintf::get(const char *key)
-{
- std::vector<struct fmt>::iterator t;
- int l, knownLength, lengthKeyMax = -1;
- struct fmt retval;
-
- retval.key=NULL; retval.value=NULL;
- knownLength = (int)strlen(key);
-
- for(t = v.begin(); t != v.end(); t++)
- {
- l = (int)strlen((*t).key);
- if (l > knownLength)
- {
- continue;
- }
- if (strncmp(key, (*t).key, l) == 0)
- {
- if (l > lengthKeyMax)
- {
- retval = (*t);
- lengthKeyMax = l;
- }
- }
- }
- return retval;
-}
-
-
-const char * kprintf::findType(char *type)
-{
- size_t i;
-
- for(i=0; i<sizeof(types)/sizeof(const char*); i++)
- {
- if (strcmp(type, types[i]) == 0)
- return types[i];
- }
- return NULL;
-}
-
-const char * kprintf::findVectorWidthType(char *type)
-{
- size_t i;
-
- for(i=0; i<sizeof(vectorWidthTypes)/sizeof(const char*); i++)
- {
- if (strcmp(type, vectorWidthTypes[i]) == 0)
- return vectorWidthTypes[i];
- }
- return NULL;
-}
-
-const char *kprintf::findTypeVLOAD(char *type)
-{
- size_t i;
-
- for(i=0; i<sizeof(vloadTypes)/sizeof(const char*); i++)
- {
- if (strcmp(type, vloadTypes[i]) == 0)
- return vloadTypes[i];
- }
- return NULL;
-}
-
-const char *kprintf::findTypeVSTORE(char *type)
-{
- size_t i;
-
- for(i=0; i<sizeof(vstoreTypes)/sizeof(const char*); i++)
- {
- if (strcmp(type, vstoreTypes[i]) == 0)
- return vstoreTypes[i];
- }
- return NULL;
-}
-
-void kprintf::generateVecSuffix(char *p, int n)
-{
- // FIXED
- /*
- if ( n == 1)
- {
- p[0] = 0;
- return;
- }
- */
- if (n < 10)
- {
- p[0] = (char)('0' + n);
- p[1] = 0;
- } else {
- p[0] = (char)('0' + (n/10));
- p[1] = (char)('0' + (n%10));
- p[2] = 0;
- }
- return;
-}
-
-void kprintf::registerType(const char *baseType, int vecWidth, int internalVecWidth)
-{
- char vecSuffix[3], vecSuffixPtype[3];
- char derivedType[9], derivedTypePtype[9];
- const char *string;
-
- vectorWidth = vecWidth;
- if (internalVecWidth == 1)
- {
- s_or_v = SCALAR;
- effectiveVectorWidthOnBaseType = vecWidth;
- put("%BASEWIDTH", "1");
- } else {
- s_or_v = VECTOR;
- effectiveVectorWidthOnBaseType = vecWidth*internalVecWidth;
- put("%BASEWIDTH", "2");
- }
-
- vecSuffix[0] = vecSuffix[1] = 0;
- vecSuffixPtype[0] = vecSuffixPtype[1] = 0;
- put("%TYPE", baseType);
- BASE = baseType;
- strcpy(derivedType, baseType);
- //
- //
- if (derivedType[strlen(derivedType) -1] == '2')
- {
- derivedType[strlen(derivedType) -1] = '\0';
- }
- strcpy(derivedTypePtype, derivedType);
-
- if (vecWidth > 1)
- {
- generateVecSuffix(vecSuffix, effectiveVectorWidthOnBaseType);
- generateVecSuffix(vecSuffixPtype, vecWidth);
- strcat(derivedType, vecSuffix);
- strcat(derivedTypePtype, vecSuffixPtype);
- string = findType(derivedType);
- if (string != NULL)
- {
- put("%TYPE%V", string );
- DERIVED = string;
- } else {
- std::cout << "kprint() constructor: Invalid vector width specified" << std::endl;
- throw -1;
- }
-
- string = findType(derivedTypePtype);
- if (string != NULL)
- {
- put("%PTYPE%V", string );
- } else {
- std::cout << "kprint() constructor: Invalid vector width specified" << std::endl;
- throw -1;
- }
- } else {
- put("%TYPE%V", baseType);
- string = findType(derivedTypePtype);
- put("%PTYPE%V", string);
- // FIXED
- DERIVED = baseType;
- }
-
- //
- // Register HALF (%HV), QUARTER(%QV), HALF_QUARTER(%OV) types
- //
- struct fmt f;
- f = get("%TYPE%V");
- registerReducedTypes(f.value, 2);
- registerReducedTypes(f.value, 4);
- registerReducedTypes(f.value, 8);
-
- registerSuperTypes(f.value, 2);
- registerSuperTypes(f.value, 4);
- registerSuperTypes(f.value, 8);
-
- HALFWORD = get("%TYPE%HV").value;
- QUARTERWORD = get("%TYPE%QV").value;
- HALFQUARTERWORD = get("%TYPE%OV").value;
-
- registerVectorWidth();
-
- // Register MakeVector : V, HV, QV, OV
- put("%MAKEV", NULL);
- put("%MAKHV", NULL);
- put("%MAKQV", NULL);
- put("%MAKOV", NULL);
-}
-
-void kprintf::registerReducedTypes( const char* in, int div)
-{
- char vecSuffix[3] = {0};
- char tempStr[9] = {0};
- const char* reducedCase = (div == 2) ? "%TYPE%HV" : ( div == 4) ? "%TYPE%QV" : "%TYPE%OV";
- const char* reducedVectorLength = (div == 2) ? "%HV" : ( div == 4) ? "%QV" : "%OV";
- bool vecSuffixEmpty = false;
-
- if ( !( effectiveVectorWidthOnBaseType / div))
- {
- //std::cout << "Warning : Vector reduces to zero - registering " << reducedCase << " as NULL" << std::endl;
- put(reducedCase, "NULL");
- return;
- }
-
- if ((effectiveVectorWidthOnBaseType / div) > 1)
- {
- generateVecSuffix( vecSuffix, effectiveVectorWidthOnBaseType / div);
- } else {
- vecSuffix[0] = '\0';
- vecSuffixEmpty = true;
- }
-
- if( in[4] == 't') // float
- {
- strcpy( tempStr, "float");
- }
- else
- {
- strcpy( tempStr, "double");
- }
-
- strcat( tempStr, vecSuffix);
- put( reducedCase, findType(tempStr));
- if (vecSuffixEmpty == false)
- put( reducedVectorLength, findVectorWidthType(vecSuffix));
- else
- put( reducedVectorLength, "1");
-}
-
-void kprintf::registerSuperTypes( const char* in, int mul)
-{
- char vecSuffix[3] = {0};
- char tempStr[9] = {0};
- const char* superCase = ((mul == 2) ? "%TYPE%DV" : ( mul == 4) ? "%TYPE%QUADV" : "%TYPE%OCTAV");
- const char* superVectorLength = ((mul == 2) ? "%DV" : ( mul == 4) ? "%QUADV" : "%OCTAV");
-
- if ( ( effectiveVectorWidthOnBaseType * mul) > 16)
- {
- //std::cout << "Warning : Super Vector is not a OCL type- registering " << superCase << " as NULL" << std::endl;
- put(superCase, "NULL");
- return;
- }
-
- if ((effectiveVectorWidthOnBaseType * mul) > 1)
- {
- generateVecSuffix( vecSuffix, effectiveVectorWidthOnBaseType * mul);
- } else {
- vecSuffix[0] = '\0';
- }
-
- if( in[4] == 't') // float
- {
- strcpy( tempStr, "float");
- }
- else
- {
- strcpy( tempStr, "double");
- }
-
- strcat( tempStr, vecSuffix);
- put( superCase, findType(tempStr));
- put( superVectorLength, findVectorWidthType(vecSuffix));
-}
-
-char* kprintf::mystrtok( char* in, const char* tok)
-{
- char* last;
- if ( in ) // in is not NULL
- {
- last = in;
- // Initialize strtokPtr
- strtokPtr = in;
-
- // look for '('
- while( *strtokPtr != '(')
- {
- strtokPtr++;
- }
-
- *strtokPtr = '\0';
- strtokPtr++;
- strtokCount = 1;
- }
- else
- {
- last = strtokPtr;
- // Look for tokens other than '('
- while(strtokPtr[0])
- {
- bool tokenFound = false;
- for( size_t i=0 ; i <= (strlen(tok) - 1); i++)
- {
- if (*strtokPtr == tok[i])
- {
- if ( tok[i] == '(')
- {
- strtokCount++;
- continue;
- }
- else if ( tok[i] == ')')
- {
- strtokCount--;
- if ( strtokCount != 0)
- {
- continue;
- }
- }
-
- // Token matched
- *strtokPtr = '\0';
- tokenFound = true;
- break;
- }
- }
-
- if ( tokenFound)
- {
- strtokPtr++;
- break;
- }
-
- strtokPtr++;
- }
- }
- return last;
-}
-//
-// VLOAD %TYPE%V from (%PTYPE*) kind of memory locations
-// The Kernel writers should use "%TYPE" and "%TYPE%V" for kernel aguments, local variables etc..
-// However, while loading using %VLOAD, they should cast the pointers as "%PTYPE *" because
-// VLOADn imposes certain restrictions.
-// Having the pointers as %TYPE and %TYPE%V relieves us from address calculations for primitives
-// which are vectors (like float2, double2 etc..)
-//
-void kprintf::registerVLOAD()
-{
- const char *string;
- char vecSuffix[3] = {0};
- char tempStr[9] = {0};
-
- generateVecSuffix( vecSuffix, effectiveVectorWidthOnBaseType); // VLOAD %TYPE%V from %PTYPE kind of memory locations
- strcpy( tempStr, "vload");
- strcat( tempStr, vecSuffix);
- string = findTypeVLOAD(tempStr);
- if (string != NULL)
- {
- put( "%VLOAD", string);
- } else {
- std::cerr << "registerVLOAD: " << tempStr << " not a valid VLOAD type" << std::endl;
- }
-}
-
-void kprintf::registerVSTORE(void)
-{
- const char *string;
- char vecSuffix[3] = {0};
- char tempStr[9] = {0};
-
- generateVecSuffix( vecSuffix, effectiveVectorWidthOnBaseType); // VSTORE %TYPE%V from %PTYPE kind of memory locations
- strcpy( tempStr, "vstore");
- if (effectiveVectorWidthOnBaseType > 1)
- {
- strcat( tempStr, vecSuffix);
- }
- string = findTypeVSTORE(tempStr);
- if (string != NULL)
- {
- put( "%VSTORE_VALUE", string);
- } else {
- std::cerr << "registerVSTORE: " << tempStr << " not a valid VSTORE type" << std::endl;
- }
-}
-
-void kprintf::registerVectorWidth()
-{
- const char *string;
- char vecSuffix[3] = {0};
- generateVecSuffix( vecSuffix, vectorWidth); // VLOAD %TYPE%V from %PTYPE kind of memory locations
- string = findVectorWidthType(vecSuffix);
- if (string != NULL)
- {
- put( "%V", string);
-
- } else {
- std::cerr << "registerVectorWidth: " << string << " not a valid Vector Width size" << std::endl;
- }
-}
-
-void kprintf::handleMakeVector(char **_src, char **_dst, int div)
-{
- int numCharsWritten = 0;
- char id[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "()");
- ptr = mystrtok( NULL, "()"); // Get ID
- strcpy( id, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
-
- if ( div == 0 ) // Scalar Case
- {
- numCharsWritten = sprintf(dst,"(%s)(", BASE);
- dst += numCharsWritten;
-
- if ( s_or_v == VECTOR)
- {
- if ( strcmp( BASE,"float") == 0 || strcmp( BASE,"float2") == 0)
- {
- numCharsWritten = sprintf(dst," %s%c,", id, 'f');
- }
- else
- {
- numCharsWritten = sprintf(dst," %s,", id);
- }
- dst += numCharsWritten;
- }
-
- if ( strcmp( BASE,"float") == 0 || strcmp( BASE,"float2") == 0 )
- {
- numCharsWritten = sprintf(dst," %s%c)", id,'f');
- }
- else
- {
- numCharsWritten = sprintf(dst," %s)", id);
-
- }
- dst += numCharsWritten;
- *_dst = dst;
- }
- else
- {
- numCharsWritten = sprintf(dst,"(%s)(", (div == 1)? DERIVED : (div == 2)? HALFWORD : (div == 4)? QUARTERWORD: HALFQUARTERWORD);
- dst += numCharsWritten;
-
- for( int i = 1 ; i < (vectorWidth/ div); i++)
- {
- numCharsWritten = sprintf(dst," %s,", id);
- dst += numCharsWritten;
- }
-
- numCharsWritten = sprintf(dst," %s)", id);
- dst += numCharsWritten;
- *_dst = dst;
- }
-}
-
-void kprintf::handleMUL(char **_src, char **_dst, bool vmul)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- int vwidth=1;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
- //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
- if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) )
- {
- if (vmul == false)
- {
- std::cout << "%MUL( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- } else {
- std::cout << "%VMUL( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- }
- throw -1;
- }
-
- switch(s_or_v)
- {
- case SCALAR:
- numCharsWritten = sprintf(dst, "%s = %s * %s", id1, id2, id3);
- dst += numCharsWritten;
- break;
-
- case VECTOR:
- if (vmul == true)
- {
- vwidth = vectorWidth;
- } else {
- vwidth = 1;
- }
-#ifdef MUL_SCALAR_UNROLL
- for(int i=0; i<vwidth; i++)
- {
- numCharsWritten = sprintf(dst, "%s.%s = (((%s.%s)*(%s.%s)) -( (%s.%s)*(%s.%s)));\n",
- id1, vecIndices[i*2],
- id2, vecIndices[i*2], id3, vecIndices[i*2],
- id2, vecIndices[i*2 + 1], id3, vecIndices[i*2 + 1]);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s.%s = (((%s.%s)*(%s.%s)) + ( (%s.%s)*(%s.%s)));\n",
- id1, vecIndices[i*2+1],
- id2, vecIndices[i*2], id3, vecIndices[i*2 + 1],
- id2, vecIndices[i*2 + 1], id3, vecIndices[i*2]);
- dst += numCharsWritten;
- }
-#else
- //
- // Vector Unroll - Extract ODD and EVEN stuff and express multiplication via vectors
- //
- numCharsWritten = sprintf( dst, "%s.even = ((%s.even) * (%s.even)) - ((%s.odd) * (%s.odd));\n", id1, id2, id3, id2, id3);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf( dst, "%s.odd = ((%s.even) * (%s.odd)) + ((%s.odd) * (%s.even));\n", id1, id2, id3, id2, id3);
- dst += numCharsWritten;
-#endif
- break;
- default:
- std::cout << "handleMUL: s_or_v is neither scalar nor a vector" << std::endl;
- throw -1;
- }
- *_dst = dst;
-}
-
-void kprintf::handleMAD(char **_src, char **_dst, bool vmul)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- int vwidth=1;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
- //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
- if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) )
- {
- if (vmul == false)
- {
- std::cout << "%MAD( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- } else {
- std::cout << "%VMAD( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- }
- throw -1;
- }
-
- switch(s_or_v)
- {
- case SCALAR:
- #ifdef ACCURACY_OVER_SPEED
- numCharsWritten = sprintf(dst, "%s += %s * %s", id1, id2, id3);
- //
- // Enable the below to generated MADs - No much difference seen for SGEMM.
- // Need to check for DGEMM
- //
- #else
- numCharsWritten = sprintf(dst, "%s = mad(%s,%s,%s)", id1, id2, id3, id1);
- #endif
- dst += numCharsWritten;
- break;
-
- case VECTOR:
- if (vmul == true)
- {
- vwidth = vectorWidth;
- } else {
- vwidth = 1;
- }
-#ifdef MUL_SCALAR_UNROLL
- for(int i=0; i<vwidth; i++)
- {
- numCharsWritten = sprintf(dst, "%s.%s = %s.%s + (((%s.%s)*(%s.%s)) -( (%s.%s)*(%s.%s)));\n",
- id1, vecIndices[i*2], id1, vecIndices[i*2],
- id2, vecIndices[i*2], id3, vecIndices[i*2],
- id2, vecIndices[i*2 + 1], id3, vecIndices[i*2 + 1]);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s.%s = %s.%s + (((%s.%s)*(%s.%s)) + ( (%s.%s)*(%s.%s)));\n",
- id1, vecIndices[i*2+1], id1, vecIndices[i*2+1],
- id2, vecIndices[i*2], id3, vecIndices[i*2 + 1],
- id2, vecIndices[i*2 + 1], id3, vecIndices[i*2]);
- dst += numCharsWritten;
- }
-#else
- //
- // Vector Unroll - Extract ODD and EVEN stuff and express multiplication via vectors
- //
- #define COMPLEX_MUL_ADD
- #ifdef COMPLEX_MUL_ADD
- numCharsWritten = sprintf( dst, "%s.even = %s.even + ((%s.even) * (%s.even)) - ((%s.odd) * (%s.odd));\n", id1, id1, id2, id3, id2, id3);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf( dst, "%s.odd = %s.odd + ((%s.even) * (%s.odd)) + ((%s.odd) * (%s.even));\n", id1, id1, id2, id3, id2, id3);
- dst += numCharsWritten;
- #else
- #define COMPLEX_MAD_USING_LOCAL_VARIABLES
- #ifdef COMPLEX_MAD_USING_LOCAL_VARIABLES
- numCharsWritten = sprintf(dst, "\n{ %s id2even = %s.even, id2odd = %s.odd, id3even = %s.even, id3odd = %s.odd;\n\t",
- HALFWORD, id2, id2, id3, id3);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.even = mad(id2even, id3even, %s.even);\n\t", id1, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.odd = mad(id2even, id3odd, %s.odd);\n\t", id1, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.even = mad(id2odd, -id3odd, %s.even);\n\t", id1, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.odd = mad(id2odd, id3even, %s.odd);\n", id1, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "}\n");
- dst += numCharsWritten;
- #else
- numCharsWritten = sprintf( dst, "%s.even = mad(%s.even, %s.even, %s.even);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.even = mad(%s.odd, -%s.odd, %s.even);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.odd = mad(%s.even, %s.odd, %s.odd);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.odd = mad(%s.odd, %s.even, %s.odd);\n", id1, id2, id3, id1);
- dst += numCharsWritten;
- #endif
-#endif
-#endif
- break;
- default:
- std::cout << "handleMAD: s_or_v is neither scalar nor a vector" << std::endl;
- throw -1;
- }
- *_dst = dst;
-}
-
-void kprintf::handleVMAD_AND_REDUCE(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- int vwidth=1;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
- //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
- if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) )
- {
- std::cout << "%VMAD_AND_REDUCE( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- throw -1;
- }
-
- switch(s_or_v)
- {
- case SCALAR:
- if (vectorWidth == 1)
- {
- numCharsWritten = sprintf(dst, "%s = mad(%s,%s,%s);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
-
- } else {
- for(int i=0; i<vectorWidth; i++)
- {
- numCharsWritten = sprintf(dst, "%s = mad((%s).%s,(%s).%s,(%s));\n\t", id1, id2, vecIndices[i], id3,
- vecIndices[i], id1);
- dst += numCharsWritten;
- }
- }
- break;
-
- case VECTOR:
- if (vectorWidth == 1)
- {
- numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S0,(%s).S0,%s.S0);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S1,-(%s.S1),%s.S0);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S0,(%s).S1,%s.S1);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S1,(%s.S0),%s.S1);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- } else {
- for(int i=0; i<vectorWidth; i++)
- {
- numCharsWritten = sprintf(dst, "(%s).S0 = mad((%s).%s,(%s).%s,(%s).S0);\n\t", id1, id2, vecIndices[2*i], id3,
- vecIndices[2*i], id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "(%s).S0 = mad((%s).%s,-(%s).%s,(%s).S0);\n\t", id1, id2, vecIndices[2*i + 1], id3,
- vecIndices[2*i + 1], id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "(%s).S1 = mad((%s).%s,(%s).%s,(%s).S1);\n\t", id1, id2, vecIndices[2*i], id3,
- vecIndices[2*i + 1], id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "(%s).S1 = mad((%s).%s,(%s).%s,(%s).S1);\n\t", id1, id2, vecIndices[2*i + 1], id3,
- vecIndices[2*i], id1);
- dst += numCharsWritten;
- }
- }
- break;
-
- default:
- std::cout << "handleVMAD_AND_REDUCE: s_or_v is neither scalar nor a vector" << std::endl;
- throw -1;
- }
- *_dst = dst;
-}
-
-void kprintf::handleMAD_AND_REDUCE(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- int vwidth=1;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
- //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
- if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) )
- {
- std::cout << "%MAD_AND_REDUCE( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- throw -1;
- }
-
- switch(s_or_v)
- {
- case SCALAR:
- //
- // e.g. float += float4*float4
- // We will use only the first vector component
- //
- if (vectorWidth == 1)
- {
- numCharsWritten = sprintf(dst, "%s = mad(%s,%s,%s);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
-
- } else {
- numCharsWritten = sprintf(dst, "%s = mad(%s.%s,%s.%s,%s);\n\t", id1, id2, vecIndices[0], id3,
- vecIndices[0], id1);
- dst += numCharsWritten;
- }
- break;
-
- case VECTOR:
- numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S0,(%s).S0,%s.S0);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S1,-(%s.S1),%s.S0);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S0,(%s).S1,%s.S1);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S1,(%s.S0),%s.S1);\n\t", id1, id2, id3, id1);
- dst += numCharsWritten;
- break;
-
- default:
- std::cout << "handleMAD_AND_REDUCE: s_or_v is neither scalar nor a vector" << std::endl;
- throw -1;
- }
- *_dst = dst;
-}
-
-void kprintf::handleComplexJoin(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char *ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
- //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
-
- switch(s_or_v)
- {
- case SCALAR:
- //
- // Dont do a thing...ComplexJoin not applicable for Real numbers
- //
- break;
-
- case VECTOR:
- for(int i=0; i<effectiveVectorWidthOnBaseType; i++)
- {
- if (effectiveVectorWidthOnBaseType > 2)
- {
- if ((i % 2) == 0)
- {
- numCharsWritten = sprintf(dst, "%s.%s = %s.%s;\n",
- id1, vecIndices[i],
- id2, vecIndices[i/2]);
- dst += numCharsWritten;
- } else {
- numCharsWritten = sprintf(dst, "%s.%s = %s.%s;\n",
- id1, vecIndices[i],
- id3, vecIndices[i/2]);
- dst += numCharsWritten;
- }
- } else {
- if ((i % 2) == 0)
- {
- numCharsWritten = sprintf(dst, "%s.%s = %s;\n",
- id1, vecIndices[i],
- id2);
- dst += numCharsWritten;
- } else {
- numCharsWritten = sprintf(dst, "%s.%s = %s;\n",
- id1, vecIndices[i],
- id3);
- dst += numCharsWritten;
- }
- }
- }
- break;
-
- default:
- std::cout << "handleComplexJoin: s_or_v is neither scalar nor a vector" << std::endl;
- throw -1;
- }
- *_dst = dst;
-}
-
-void kprintf::handleDIV(char **_src, char **_dst, bool vdiv)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- int vwidth=1;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
- //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
- if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) )
- {
- if (vdiv == false)
- {
- std::cout << "%DIV( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- } else {
- std::cout << "%VDIV( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
- }
- throw -1;
- }
-
- switch(s_or_v)
- {
- case SCALAR:
- numCharsWritten = sprintf(dst, "%s = %s / %s", id1, id2, id3);
- dst += numCharsWritten;
- break;
-
- case VECTOR:
- if (vdiv == true)
- {
- vwidth = vectorWidth;
- } else {
- vwidth = 1;
- }
-#ifdef DIV_SCALAR_UNROLL
- for(int i=0; i<vwidth; i++)
- {
- numCharsWritten = sprintf(dst, "%s.%s = (((%s.%s)*(%s.%s)) + ( (%s.%s)*(%s.%s)));\n",
- id1, vecIndices[i*2],
- id2, vecIndices[i*2], id3, vecIndices[i*2],
- id2, vecIndices[i*2 + 1], id3, vecIndices[i*2 + 1]);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf(dst, "%s.%s = (-((%s.%s)*(%s.%s)) + ( (%s.%s)*(%s.%s)));\n",
- id1, vecIndices[i*2+1],
- id2, vecIndices[i*2], id3, vecIndices[i*2 + 1],
- id2, vecIndices[i*2 + 1], id3, vecIndices[i*2]);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf(dst, "%s.%s /= ((%s.%s * %s.%s) + (%s.%s * %s.%s));\n",
- id1, vecIndices[i*2],
- id3, vecIndices[i*2], id3, vecIndices[i*2],
- id3, vecIndices[i*2+1], id3, vecIndices[i*2+1]);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf(dst, "%s.%s /= ((%s.%s * %s.%s) + (%s.%s * %s.%s));\n",
- id1, vecIndices[i*2 + 1],
- id3, vecIndices[i*2], id3, vecIndices[i*2],
- id3, vecIndices[i*2+1], id3, vecIndices[i*2+1]);
- dst += numCharsWritten;
- }
-#else
- //
- // Vector Unroll - Extract ODD and EVEN stuff and express multiplication via vectors
- //
- numCharsWritten = sprintf( dst, "%s.even = ((%s.even) * (%s.even)) + ((%s.odd) * (%s.odd));\n", id1, id2, id3, id2, id3);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf( dst, "%s.odd = -((%s.even) * (%s.odd)) + ((%s.odd) * (%s.even));\n", id1, id2, id3, id2, id3);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf( dst, "%s.even /= (%s.even*%s.even) + (%s.odd*%s.odd) ;\n", id1, id3, id3, id3, id3);
- dst += numCharsWritten;
- numCharsWritten = sprintf( dst, "%s.odd /= (%s.even*%s.even) + (%s.odd*%s.odd) ;\n", id1, id3, id3, id3, id3);
- dst += numCharsWritten;
-
-#endif
- break;
- default:
- std::cout << "handleDIV: s_or_v is neither scalar nor a vector" << std::endl;
- throw -1;
- }
- *_dst = dst;
-}
-
-void kprintf::handleAlignedDataAccess(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256];
- char id2[256];
- char * ptr, * offsetptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "()");
- ptr = mystrtok( NULL, "()");
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
- strcpy( id2, id1);
-
- // To skip offset in id1
- ptr = id1;
- for( int i=0;;i++, ptr++)
- {
- if ( *ptr == ',')
- break;
- }
- ptr++;
-
- if (( ! this->doVLOAD) || (effectiveVectorWidthOnBaseType == 1))
- {
- numCharsWritten = sprintf(dst, "*((__global %s*)(%s))", DERIVED, ptr);
- dst += numCharsWritten;
- }
- else
- {
- offsetptr = id2;
- for( int i=0; ; i++, offsetptr++)
- {
- if ( *offsetptr == ',')
- break;
- }
- offsetptr++;
- *offsetptr = '\0';
-
- const char *string;
- char vecSuffix[3] = {0};
- char tempStr[9] = {0};
-
- generateVecSuffix( vecSuffix, effectiveVectorWidthOnBaseType); // VLOAD %TYPE%V from %PTYPE kind of memory locations
- strcpy( tempStr, "vload");
- strcat( tempStr, vecSuffix);
- string = findTypeVLOAD(tempStr);
- if (string != NULL)
- {
- put( "%VLOAD", string);
- } else {
- std::cerr << "handleAlignedDataAccess: " << tempStr << " not a valid VLOAD type" << std::endl;
- }
-
-
- struct fmt f;
- f = get("%PTYPE");
-
- numCharsWritten = sprintf(dst, "%s( %s (__global %s *)%s)", tempStr, id2, f.value, ptr);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-//
-// %VSTORE(data, 0, address)
-//
-void kprintf::handleAlignedVSTORE(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char * ptr, *id1, *id2, *id3;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "()"); // Get rid of %VSTORE keyword
- id1 = mystrtok( NULL, ","); // PTR now points to "data"
- id2 = mystrtok( NULL, ","); // PTR now points to "0"
- id3 = mystrtok( NULL, "()"); // PTR now points to "address" which is wrapped around in ()
- *_src = id3 + strlen(id3) + 1;
-
- if (( ! this->doVSTORE) || (effectiveVectorWidthOnBaseType == 1))
- {
- numCharsWritten = sprintf(dst, "*((__global %s*)(%s) + %s) = %s", DERIVED, id3, id2, id1); // NOTE:Assuming "__global"
- dst += numCharsWritten;
- }
- else
- {
- struct fmt vstore, ptype;
- vstore = get("%VSTORE_VALUE");
- ptype = get("%PTYPE");
- if ((vstore.value == NULL) || (ptype.value == NULL))
- {
- numCharsWritten = sprintf(dst, "--ERROR in VSTORE--");
- dst += numCharsWritten;
- return;
- }
-
- numCharsWritten = sprintf(dst, "%s( %s, %s, (__global %s *)%s)", vstore.value, id1, id2, ptype.value, id3);
- dst += numCharsWritten;
- }
- *_dst = dst;
- return;
-}
-
-void kprintf::handlePredicate(char **_src, char **_dst)
-{
- //int numCharsWritten = 0;
- char * ptr, *id1;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "()"); // Get rid of %IF keyword
- id1 = mystrtok( NULL, ")"); // PTR now points to "data"
- *_src = id1 + strlen(id1) + 1;
- src = *_src;
-
- struct fmt predicate = get(id1);
- int condition = atoi(predicate.value);
- if (condition >= 1) // PENDING: (condition > 1) worked fine before.
- {
- //printf("KPRINTF: Handle Predicate is TRUE - Predicate = %s\n", predicate.value);
- return;
- } else {
- //printf("KPRINTF: Handle Predicate is FALSE - predicate = %s\n", predicate.value);
- while((*src != '\0') && (*src != '\n'))
- {
- src++;
- }
- *dst = '\n';
- dst++;
- }
-
- *_dst = dst;
- *_src = src;
- return;
-}
-
-void kprintf::handleADD_SUB(char **_src, char **_dst, const char op)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- numCharsWritten = sprintf(dst, "%s = %s %c %s", id1, id2, op, id3);
- dst += numCharsWritten;
-
- *_dst = dst;
-}
-
-void kprintf::handleVLoadWithIncx(char **_src, char **_dst, bool ignoreFirst)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
-
- if (ignoreFirst == false)
- {
- numCharsWritten = sprintf(dst,"%s = ", id1);
- dst += numCharsWritten;
- }
-
- numCharsWritten = sprintf(dst,"(%s)(", DERIVED);
- dst += numCharsWritten;
-
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst," %s[0 + (%s * %d)],", id2, id3, i);
- dst += numCharsWritten;
- }
-
- numCharsWritten = sprintf(dst," %s[0 + (%s * %d)])", id2, id3, vectorWidth - 1);
- dst += numCharsWritten;
- *_dst = dst;
-}
-
-
-void kprintf::handleVStoreWithIncx(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256], id2[256], id3[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get third ID
- strcpy( id3, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if ( s_or_v == SCALAR)
- {
-
- for( int i = 0 ; i < (vectorWidth); i++)
- {
- if (vectorWidth != 1)
- {
- numCharsWritten = sprintf(dst," %s[0 + (%s * %d)] = %s.%s;\n", id1, id3, i, id2, vecIndices[i]);
- } else {
- numCharsWritten = sprintf(dst," %s[0 + (%s * %d)] = %s;\n", id1, id3, i, id2);
- }
- dst += numCharsWritten;
- }
- }
- else
- {
- for( int i = 0 ; i < (vectorWidth); i++)
- {
- numCharsWritten = sprintf(dst," %s[0 + (%s * %d)] = %s.s%d%d;\n", id1, id3, i, id2, (i*2), (i*2 + 1));
- dst += numCharsWritten;
- }
- }
-
- *_dst = dst;
-}
-
-void kprintf::handleReduceSum(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if(vectorWidth > 1)
- {
- if ( s_or_v == SCALAR)
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"%s.%s + ", id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,"%s.%s;\n", id1, vecIndices[ (vectorWidth - 1)]);
- dst += numCharsWritten;
- }
- else
- {
- for( int i = 0 ; i < (vectorWidth- 1); i++)
- {
- numCharsWritten = sprintf(dst,"%s.s%d%d + ", id1,(i*2), (i*2 + 1));
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,"%s.s%d%d;\n", id1,((vectorWidth- 1)*2), ((vectorWidth- 1)*2 + 1));
- dst += numCharsWritten;
- }
- } else {
- numCharsWritten = sprintf(dst,"(%s);\n", id1);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-void kprintf::handleReduceMax(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- // val, maxVal, index, impl
- char id1[256], id2[256], id3[256], id4[256];
- char tempStr[512];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- bool reduceMaxWithIndex = false, followLowIndex = true;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- // After the first parameter is parsed, extract everything till you encounter ';'
- // Store this substring in a temp string. Then check if any extra parameter(overloaded) was passed using this substring
- ptr = mystrtok( NULL, ";");
- *_src = ptr + strlen(ptr) + 1; // 'src' string parsing is over at this point
-
- tempStr[0] = '(';
- tempStr[1] = 0;
- strcat(tempStr, ptr);
- ptr = mystrtok( tempStr, "(,)");
- ptr = mystrtok( NULL, "(,)"); // extract 2nd parameter from tempStr. Will be empty if 2nd parameter was not passed
- strcpy( id2, ptr);
- ptr = mystrtok( NULL, "(,)");
- strcpy( id3, ptr);
- ptr = mystrtok( NULL, "(,)");
- strcpy( id4, ptr);
-
- if(strcmp(id3, "") != 0)
- {
- reduceMaxWithIndex = true;
- }
-
- if(!strcmp(id4, "0"))
- {
- followLowIndex = false;
- }
-
- #ifdef DEBUG_AMAX
- std::cerr << "Handling AMAX CASE: reduceMaxWithIndex:" << reduceMaxWithIndex
- << " and followLowIndex: " << followLowIndex
- << " id1:" << id1 << " id2:" << id2 << " id3:" << id3 << " id4:" << id4 << std::endl;
- #endif
-
- if(vectorWidth > 1)
- {
- if ((s_or_v == SCALAR) && (!reduceMaxWithIndex))
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"fmax( %s.%s, ", id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst," %s.%s ", id1, vecIndices[ (vectorWidth - 1)]);
- dst += numCharsWritten;
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,")");
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,";\n");
- dst += numCharsWritten;
- }
- else if(reduceMaxWithIndex)
- {
- if(followLowIndex)
- {
- numCharsWritten = sprintf(dst,"%s = 0;",id3);
- dst += numCharsWritten;
- for(int i = 1 ; i < (vectorWidth); i++)
- {
- numCharsWritten = sprintf(dst,"\n\t(%s.%s > %s.S0)? (%s = %d, %s.S0 = %s.%s):1;",
- id1, vecIndices[i], id1, id3, i, id1, id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,"\n\t%s = %s.s0;", id2, id1);
- dst += numCharsWritten;
- }
- else // Follow High Index
- {
- numCharsWritten = sprintf(dst,"%s = 0;",id3);
- dst += numCharsWritten;
- for(int i = 1 ; i < (vectorWidth); i++)
- {
- numCharsWritten = sprintf(dst,"\n\t(%s.%s >= %s.S0)? (%s = %d, %s.S0 = %s.%s):1;",
- id1, vecIndices[i], id1, id3, i, id1, id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,"\n\t%s = %s.s0;", id2, id1);
- dst += numCharsWritten;
- }
- }
- else
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"fmax( %s.s%d%d, ", id1, (i*2), (i*2 + 1));
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst," %s.s%d%d ", id1, ((vectorWidth- 1)*2), ((vectorWidth- 1)*2 + 1));
- dst += numCharsWritten;
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,")");
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,";\n");
- dst += numCharsWritten;
- }
- }
- else
- {
- if(reduceMaxWithIndex)
- {
- numCharsWritten = sprintf(dst, "%s = 0;\n",id3);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "%s = %s;\n", id2, id1);
- dst += numCharsWritten;
- }
- else
- {
- numCharsWritten = sprintf(dst,"(%s);\n", id1);
- dst += numCharsWritten;
- }
- }
-
- *_dst = dst;
-}
-
-
-void kprintf::handleReduceMin(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if(vectorWidth > 1)
- {
- if ( s_or_v == SCALAR)
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"fmin( %s.%s, ", id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst," %s.%s ", id1, vecIndices[ (vectorWidth - 1)]);
- dst += numCharsWritten;
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,")");
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,";\n");
- dst += numCharsWritten;
- }
- else
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"fmin( %s.s%d%d, ", id1, (i*2), (i*2 + 1));
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst," %s.s%d%d ", id1, ((vectorWidth- 1)*2), ((vectorWidth- 1)*2 + 1));
- dst += numCharsWritten;
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,")");
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,";\n");
- dst += numCharsWritten;
- }
- } else {
- numCharsWritten = sprintf(dst,"(%s);\n", id1);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-void kprintf::handleReduceHypot(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if(vectorWidth > 1)
- {
- if ( s_or_v == SCALAR)
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"hypot( %s.%s, ", id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst," %s.%s ", id1, vecIndices[ (vectorWidth - 1)]);
- dst += numCharsWritten;
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,")");
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,";\n");
- dst += numCharsWritten;
- }
- else
- {
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,"hypot( %s.s%d%d, ", id1, (i*2), (i*2 + 1));
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst," %s.s%d%d ", id1, ((vectorWidth- 1)*2), ((vectorWidth- 1)*2 + 1));
- dst += numCharsWritten;
- for( int i = 0 ; i < (vectorWidth - 1); i++)
- {
- numCharsWritten = sprintf(dst,")");
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,";\n");
- dst += numCharsWritten;
- }
- } else {
- numCharsWritten = sprintf(dst,"(%s);\n", id1);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-
-//
-// scalar = %REDUCE_SUM_REAL_HV(half-vector), %REDUCE_SUM_REAL_V(vector)
-//
-void kprintf::handleReduceSumReal(char **_src, char **_dst, int vlength)
-{
- int numCharsWritten = 0;
- char id1[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if (!vlength) //Can happen for SCALAR cases where source code contains this within COMPLEX define
- {
- //
- // Dont generate a thing.
- // The src pointer has already been advanced to next line
- // Just move on..
- //
- return;
- }
-
- if (vlength != 1)
- {
- for( int i = 0 ; i < (vlength - 1); i++)
- {
- numCharsWritten = sprintf(dst,"(%s).%s + ", id1, vecIndices[i]);
- dst += numCharsWritten;
- }
- numCharsWritten = sprintf(dst,"(%s).%s;\n", id1, vecIndices[ (vlength - 1)]);
- dst += numCharsWritten;
- } else {
- numCharsWritten = sprintf(dst,"(%s);\n ", id1);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-void kprintf::handleCONJUGATE(char **_src, char **_dst)
-{
- // %CONJUGATE( doConj, loadedA );
- // loadedA = ((doConj == 1)? (loadedA.odd = -loadedA.odd, loadedA) : loadedA);
-
- int numCharsWritten = 0;
- char id1[256], id2[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- ptr = mystrtok( NULL, "(,)"); // Get second ID
- strcpy( id2, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if ( s_or_v == VECTOR)
- {
- numCharsWritten = sprintf(dst,"%s = ((%s == 1)? ( %s.odd = -%s.odd, %s) : %s)", id2, id1, id2, id2, id2, id2);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-void kprintf::handleClearImaginary(char **_src, char **_dst)
-{
- // %CLEAR_IMAGINARY( varName );
- // generates varName.odd = 0; incase of complex type
-
- int numCharsWritten = 0;
- char id1[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if ( s_or_v == VECTOR)
- {
- numCharsWritten = sprintf(dst,"%s.odd = 0.0f", id1);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-static const char * itoa(int n)
-{
- if (n > 16)
- return (const char*) NULL;
- return numbers[n];
-}
-
-//
-// PENDING: COMPLEX DATA TYPE HANDLING may need special attention
-//
-void kprintf::handleVFOR(char **src, char **dst, bool isReal)
-{
- char *start, *end;
- char *vforBody, *vforBodyTemp, *vforGeneratedBody;
- int bracecount = 0;
- int vforBodyLength;
-
- if (isReal == false)
- {
- start = (*src) + strlen("%VFOR");
- } else {
- start = (*src) + strlen("%VFOR_REAL");
- }
-
- while ( (*start != '{') && (*start != 0))
- {
- //PENDING: if (notwhitespace(*start)) { signal exception bad syntax }
- start++;
- }
- if (*start == 0)
- {
- // PENDING: Raise an EXCEPTION!
- printf("KPRINTF: handleVFOR: Bad Syntax...\n");
- return;
- }
-
- bracecount = 1;
- end = start+1;
- while(bracecount)
- {
- if (*end == 0)
- {
- break;
- } else if (*end == '{')
- {
- bracecount++;
- } else if (*end == '}') {
- bracecount--;
- }
- end++;
- }
-
- if (*end == 0)
- {
- // PENDING: Raise an EXCEPTION!
- printf("KPRINTF: handleVFOR: Bad Syntax...\n");
- return;
- }
-
- vforBodyLength = end - start;
- vforBody = (char*)malloc((vforBodyLength + 1)*sizeof(char));
- vforBodyTemp = (char*)malloc((vforBodyLength + 1)*sizeof(char));
- vforGeneratedBody = (char*)malloc(((vforBodyLength + 1)*sizeof(char)) * vectorWidth * 2);
- memcpy(vforBody, start, vforBodyLength);
- vforBody[vforBodyLength] = 0;
-
- for(int v=0; v<vectorWidth; v++)
- {
- kprintf *child = new kprintf(this->dataType, this->vectorWidth, this->doVLOAD, this->doVSTORE);
-
- child->put("%VFORINDEX", itoa(v));
- if ((isReal == true) || (this->dataType == 'S') || (this->dataType == 'D'))
- {
- //
- // Treat like REAL type
- //
- if (vectorWidth != 1)
- {
- child->put("%VFORSUFFIX", vecIndicesWithDot[v]);
- } else {
- child->put("%VFORSUFFIX", "");
- }
- } else {
- // Complex Data Type Involved
- if (vectorWidth != 1)
- {
- child->put("%VFORSUFFIX", vecComplexIndicesWithDot[v]);
- } else {
- child->put("%VFORSUFFIX", "");
- }
- }
- strcpy(vforBodyTemp, vforBody);
- child->spit(vforGeneratedBody, vforBodyTemp);
- strcat(*dst, vforGeneratedBody);
- *dst += strlen(vforGeneratedBody);
-
- delete child;
- }
-
- *src = end;
-
- free(vforBody);
- free(vforBodyTemp);
- free(vforGeneratedBody);
- return;
-}
-
-void kprintf::handleReductionFramework(char **_src, char **_dst, REDUCTION_TYPE reductionType)
-{
- /*
- * Syntax: %REDUCTION_BY_SUM( privateVariableName ); or
- * %REDUCTION_BY_MAX( privateVariableName ); or
- * %REDUCTION_BY_MAX( privateVariableName, privateVariableName2, privateVarName3); or
- * %REDUCTION_BY_MIN( privateVariableName ); or
- * %REDUCTION_BY_HYPOT( privateVariableName ); or
- * %REDUCTION_BY_SSQ( scale, ssq );
- * Reduces all elements in a workgroup by taking value from 'privateVariableName' of each work-item
- * and places the reduced item in 'privateVariableName' of the first work-item (work-item 0)
- *
- */
-
- int numCharsWritten = 0;
- // Value, Index, Implementation
- char privateVarName[256], privateVarName2[256], privateVarName3[256];
- char tempStr[512];
-
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
- bool reductionWithIndex = false;
- RedWithIndexImpl impl;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( privateVarName, ptr);
- // After the first parameter is parsed, extract everything till you encounter ';'
- // Store this substring in a temp string. Then check if any extra parameter(overloaded) was passed using this substring
- ptr = mystrtok( NULL, ";");
- *_src = ptr + strlen(ptr) + 1; // 'src' string parsing is over at this point
-
- tempStr[0] = '(';
- tempStr[1] = 0;
- strcat(tempStr, ptr);
- ptr = mystrtok( tempStr, "(,)");
- ptr = mystrtok( NULL, "(,)"); // extract 2nd parameter from tempStr. Will be empty if 2nd parameter was not passed
- strcpy( privateVarName2, ptr);
- ptr = mystrtok( NULL, "(,)");
- strcpy( privateVarName3, ptr);
-
-
- // This indicates that there was a second parameter in the call
- // Overloaded call of REDUCTION_BY_MAX for MAX_WITH_INDEX
- //
- if(strcmp(privateVarName3, "") != 0)
- {
- reductionWithIndex = true;
-
- if(!strcmp(privateVarName3, "0"))
- {
- impl = ATOMIC_FLI;
- }
- else if(!strcmp(privateVarName3, "1"))
- {
- impl = REG_FLI;
- }
- else if(!strcmp(privateVarName3, "2"))
- {
- impl = ATOMIC_FHI;
- }
- else if(!strcmp(privateVarName3, "3"))
- {
- impl = REG_FHI;
- }
- else
- {
- std::cerr << "ERROR: Invalid Reduction Type implementation";
- }
- }
-
- char ldsVarName[8], ldsVarName2[8], localId[8], selected[8];
- char p1[8], p2[8], p3[8], p4[8], p5[8];
- getRandomString(ldsVarName, 5);
- getRandomString(ldsVarName2, 5);
- getRandomString(localId, 5);
- getRandomString(selected, 5);
- getRandomString(p1, 5);
- getRandomString(p2, 5);
- getRandomString(p3, 5);
- getRandomString(p4, 5);
- getRandomString(p5, 5);
-
- if(reductionWithIndex)
- {
- numCharsWritten = sprintf(dst, "uint %s;\n", selected);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "__local %s %s [ %d ];\n", (get("%PTYPE").value), ldsVarName, (this->wgSize));
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tuint %s = get_local_id(0);\n\t%s [ %s ] = %s;\n",
- localId, ldsVarName, localId, privateVarName);
- dst += numCharsWritten;
-
- switch(impl)
- {
- case REG_FLI:
- numCharsWritten = sprintf(dst, "\t__local uint %s [ %d ];\n", ldsVarName2, (this->wgSize));
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t%s [ %s ] = %s;\n",
- ldsVarName2, localId, privateVarName2);
- dst += numCharsWritten;
- break;
-
- case ATOMIC_FLI:
- numCharsWritten = sprintf(dst, "\t__local uint %s[1];\n", ldsVarName2);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tif(%s == 0){%s[0] = UINT_MAX;}\n", localId, ldsVarName2);
- dst += numCharsWritten;
- break;
-
- }
- }
- else
- {
- if(reductionType == REDUCTION_BY_SSQ)
- {
- numCharsWritten = sprintf(dst, "__local %s %s [ %d ], %s [ %d ];\n", (get("%PTYPE").value),
- ldsVarName, (this->wgSize), ldsVarName2, (this->wgSize) );
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tuint %s = get_local_id(0);\n\t %s [ %s ] = %s; %s [ %s ] = %s;\n",
- localId, ldsVarName, localId, privateVarName, ldsVarName2, localId, privateVarName2);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t%s %s, %s, %s, %s, %s;\n", (get("%PTYPE").value), p1, p2, p3, p4, p5);
- dst += numCharsWritten;
- }
- else
- {
- numCharsWritten = sprintf(dst, "__local %s %s [ %d ];\n", (get("%TYPE").value), ldsVarName, (this->wgSize));
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tuint %s = get_local_id(0);\n\t %s [ %s ] = %s;\n",
- localId, ldsVarName, localId, privateVarName);
- dst += numCharsWritten;
- }
- }
-
- numCharsWritten = sprintf(dst, "\tbarrier(CLK_LOCAL_MEM_FENCE);\n\n");
- dst += numCharsWritten;
-
- // selected = (ldsVal[lid+32] > ldsVal[lid]) ? lid + 32 : lid;
- // selected = (ldsVal[lid+32] == ldsVal[lid]) ? (ldsIndex[lid+32] < ldsIndex[lid] ? lid + 32 : lid) : selected;
- for( int i=(this->wgSize/2); i>=2; i=(i/2) )
- {
- if(reductionWithIndex)
- {
- switch(impl)
- {
- //case ATOMIC_FLI:
- //case ATOMIC_FHI:
- case REG_FLI:
- //case REG_FHI:
- numCharsWritten = sprintf(dst, "\tif( %s < %d ) {\n ", localId, i);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst,
- "\n\t%s = (%s[%s + %d] > %s[%s]) ? %s + %d : %s;",
- selected, ldsVarName, localId, i, ldsVarName, localId,
- localId, i, localId);
- dst += numCharsWritten;
-
- numCharsWritten = sprintf(dst,
- "\n\t%s = (%s[%s + %d] == %s[%s]) ? ((%s[%s + %d] < %s[%s]) ? %s + %d : %s) : %s;",
- selected, ldsVarName, localId, i, ldsVarName, localId,
- ldsVarName2, localId, i, ldsVarName2, localId, localId, i, localId, selected);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t%s[%s] = %s[%s];\n\t %s[%s] = %s[%s];\n",
- ldsVarName, localId, ldsVarName, selected,
- ldsVarName2, localId, ldsVarName2, selected);
- dst += numCharsWritten;
- break;
-
- case ATOMIC_FLI:
- numCharsWritten = sprintf(dst, "\tif( %s < %d ) {\n ", localId, i);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst,
- "\n\t%s[%s] = fmax(%s[%s + %d], %s[%s]);",
- ldsVarName, localId, ldsVarName, localId, i, ldsVarName, localId);
- dst += numCharsWritten;
- break;
-
- }
- }
- else
- {
- numCharsWritten = sprintf(dst, "\tif( %s < %d ) {\n\t\t",
- localId, i);
- dst += numCharsWritten;
-
- switch( reductionType )
- {
- case REDUCTION_BY_SUM : numCharsWritten = sprintf(dst, " %s [ %s ] = %s [ %s ] + %s [ %s + %d ];\n",
- ldsVarName, localId, ldsVarName, localId, ldsVarName, localId, i);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_MAX : numCharsWritten = sprintf(dst, " %s [ %s ] = fmax( %s [ %s ] , %s [ %s + %d ] );\n",
- ldsVarName, localId, ldsVarName, localId, ldsVarName, localId, i);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_MIN : numCharsWritten = sprintf(dst, " %s [ %s ] = fmin( %s [ %s ] , %s [ %s + %d ] );\n",
- ldsVarName, localId, ldsVarName, localId, ldsVarName, localId, i);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_HYPOT : numCharsWritten = sprintf(dst, " %s [ %s ] = hypot( %s [ %s ] , %s [ %s + %d ] );\n",
- ldsVarName, localId, ldsVarName, localId, ldsVarName, localId, i);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_SSQ : numCharsWritten = sprintf(dst, " %s = %s = %s [ %s ];\n", p1, p2, ldsVarName, localId);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = %s [ %s ];\n", p3, ldsVarName2, localId);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = %s [ %s + %d];\n\t %s = %s [ %s + %d];\n",
- p4, ldsVarName, localId, i, p5, ldsVarName2, localId, i);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = fmax( %s, %s );\n", p2, p2, p4);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = (isnotequal(%s, (%s)0.0))?\n", p3, p2, (get("%PTYPE").value));
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t (((%s / %s) * (%s / %s) * %s) + ((%s / %s) * (%s / %s) * %s)) : %s;\n",
- p1, p2, p1, p2, p3, p4, p2, p4, p2, p5, p3);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s [ %s ] = %s;\n %s [ %s ] = %s;\n",
- ldsVarName, localId, p2, ldsVarName2, localId, p3);
- dst += numCharsWritten;
- break;
-
- default : printf("\nInvalid reduction operator!!\n");
- throw -1;
- break;
- }
- }
- numCharsWritten = sprintf(dst, "\t}\n\tbarrier(CLK_LOCAL_MEM_FENCE);\n\n");
- dst += numCharsWritten;
- }
-
- if(reductionWithIndex)
- {
- switch(impl)
- {
- case REG_FLI:
- numCharsWritten = sprintf(dst, "\tif( %s == 0 ) {\n\t%s = (%s[1] > %s[0]) ? 1 : 0;\n",
- localId, selected, ldsVarName, ldsVarName);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t%s = (%s[1] == %s[0]) ? ((%s[1] < %s[0]) ? 1 : 0) : %s;\n",
- selected, ldsVarName, ldsVarName, ldsVarName2, ldsVarName2, selected);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t%s = %s[%s];\n\t %s = %s[%s];}\n",
- privateVarName, ldsVarName, selected, privateVarName2, ldsVarName2, selected);
- dst += numCharsWritten;
- break;
-
- case ATOMIC_FLI:
- numCharsWritten = sprintf(dst, "\tif(%s == 0){%s[0] = fmax(%s[1], %s[0]);}\n",
- localId, ldsVarName, ldsVarName, ldsVarName);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tbarrier(CLK_LOCAL_MEM_FENCE);\n");
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tif(%s == %s[0]){atomic_min((%s + 0), %s);}\n",
- privateVarName, ldsVarName, ldsVarName2, privateVarName2);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tbarrier(CLK_LOCAL_MEM_FENCE);\n");
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tif(%s == 0){%s = %s[0]; %s = %s[0];}\n",
- localId, privateVarName2, ldsVarName2, privateVarName, ldsVarName);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\tbarrier(CLK_LOCAL_MEM_FENCE);\n");
- dst += numCharsWritten;
- break;
-
- }
- }
- else
- {
- numCharsWritten = sprintf(dst, "\tif( %s == 0 ) {\n\t", localId);
- dst += numCharsWritten;
-
- switch( reductionType )
- {
- case REDUCTION_BY_SUM : numCharsWritten = sprintf(dst, "%s = %s [0] + %s [1];\n\t}",
- privateVarName, ldsVarName, ldsVarName);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_MAX : numCharsWritten = sprintf(dst, "%s = fmax( %s [0] , %s [1] );\n\t}",
- privateVarName, ldsVarName, ldsVarName);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_MIN : numCharsWritten = sprintf(dst, "%s = fmin( %s [0] , %s [1] );\n\t}",
- privateVarName, ldsVarName, ldsVarName);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_HYPOT : numCharsWritten = sprintf(dst, "%s = hypot( %s [0] , %s [1] );\n\t}",
- privateVarName, ldsVarName, ldsVarName);
- dst += numCharsWritten;
- break;
-
- case REDUCTION_BY_SSQ : numCharsWritten = sprintf(dst, " %s = %s = %s [0];\n", p1, p2, ldsVarName);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = %s [0];\n", p3, ldsVarName2);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = %s [1];\n\t %s = %s [1];\n",
- p4, ldsVarName, p5, ldsVarName2);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = fmax( %s, %s );\n", p2, p2, p4);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = (isnotequal(%s, (%s)0.0))?\n", p3, p2, (get("%PTYPE").value));
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t (((%s / %s) * (%s / %s) * %s) + ((%s / %s) * (%s / %s) * %s)) : %s;\n",
- p1, p2, p1, p2, p3, p4, p2, p4, p2, p5, p3);
- dst += numCharsWritten;
- numCharsWritten = sprintf(dst, "\t %s = %s;\n\t %s = %s;\n\t}",
- privateVarName, p2, privateVarName2, p3);
- dst += numCharsWritten;
- break;
-
- default : printf("\nInvalid reduction operator!!\n");
- throw -1;
- break;
- }
- }
- *_dst = dst;
-}
-
-void kprintf::handleVABS(char **_src, char **_dst)
-{
- int numCharsWritten = 0;
- char id1[256];
- char * ptr;
- char *src = *_src;
- char *dst = *_dst;
-
- ptr = mystrtok( src, "(,)");
- ptr = mystrtok( NULL, "(,)"); // Get first ID
- strcpy( id1, ptr);
- *_src = ptr + strlen(ptr) + 1;
-
- if(s_or_v == SCALAR)
- {
- numCharsWritten = sprintf(dst, "fabs(%s)", id1);
- dst += numCharsWritten;
- }
- else
- {
- numCharsWritten = sprintf(dst, "fabs(%s.even) + fabs(%s.odd)", id1, id1);
- dst += numCharsWritten;
- }
-
- *_dst = dst;
-}
-
-void kprintf::getRandomString(char *str, int length)
-{
- static char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
- length = (length==0)? 1: length;
-
- str[0] = charset[rand() % 52]; // First char has to be alphabet
- for (int i = 1; i < length; i++)
- str[i] = charset[rand() % 62];
-
- str[length] = '\0';
- return;
-}
-
-void kprintf::doConstruct(const char *type, int vecWidth, bool doVLOAD, bool doVSTORE, int _wgSize)
-{
- this->doVLOAD = doVLOAD;
- this->doVSTORE = doVSTORE;
- this->wgSize = _wgSize;
-
- if ((strcmp(type, "single") != 0) &&
- (strcmp(type,"double") != 0) &&
- (strcmp(type,"complex") != 0) &&
- (strcmp(type,"doublecomplex") != 0))
- {
- std::cout << "kprint() constructor: Type is not supported" << std::endl;
- throw -1;
- }
-
- if (vecWidth <= 0)
- {
- std::cout << "kprint() constructor: vecWidth is <= 0" << std::endl;
- throw -1;
- }
-
- maxKeySize = 0; // NOTE: This has to be done before REGISTERING types. Dependency on "put"
-
- //
- // Arrive at %TYPE and %TYPE%V attributes
- //
- if (strcmp(type,"single") == 0)
- {
- put("%PTYPE", "float"); // Primitive Type
- put("%PREFIX", "S"); // Prefix
- registerType("float", vecWidth);
- }
-
- if (strcmp(type,"double") == 0)
- {
- put("%PTYPE", "double"); // Primitive Type
- put("%PREFIX", "D"); // Prefix
- registerType("double", vecWidth);
- }
-
- if (strcmp(type,"complex") == 0)
- {
- put("%PTYPE", "float"); // Primitive Type
- put("%PREFIX", "C"); // Prefix
- registerType("float2", vecWidth, 2);
- }
-
- if (strcmp(type,"doublecomplex") == 0)
- {
- put("%PTYPE", "double"); // Primitive Type
- put("%PREFIX", "Z"); // Prefix
- registerType("double2", vecWidth, 2);
- }
-
- registerVSTORE(); //Get "%VSTORE_VALUE" - This is for internal use to handle %VLOAD
-
- put("%VLOAD", NULL);
- put("%VSTORE", NULL);
- put("%CONJUGATE", NULL);//Directive
- put("%CLEAR_IMAGINARY", NULL);//Directive
- put("%COMPLEX_JOIN", NULL);//Directive
- put("%MAD", NULL); //Directive
- put("%VMAD", NULL); //Directive
- put("%VMAD_AND_REDUCE", NULL); //Directive
- put("%MAD_AND_REDUCE", NULL); //Directive
- put("%MUL", NULL); //Directive
- put("%VMUL", NULL); //Directive
- put("%ADD", NULL); //Directive
- put("%SUB", NULL); //Directive
- put("%DIV", NULL); //Directive
- put("%VDIV", NULL); //Directive
- put("%MAKEVEC", NULL); //Directive
- put("%VMAKEVEC", NULL); //Directive
- put("%INIT", NULL); //Directive
- put("%VMAKEHVEC", NULL);//Directive
- put("%VMAKEQVEC", NULL);//Directive
- put("%VMAKEOVEC", NULL);//Directive
- put("%VLOADWITHINCX", NULL);//Directive
- put("%VLOADWITHINCXV2", NULL);//Directive
- put("%VSTOREWITHINCX", NULL);//Directive
- put("%REDUCE_SUM", NULL);//Directive
- put("%REDUCE_SUM_REAL_HV", NULL);//Directive
- put("%REDUCE_MAX", NULL);//Directive
- put("%REDUCE_MIN", NULL);//Directive
- put("%REDUCE_HYPOT", NULL);//Directive
- put("%IF", NULL);//Directive
- put("%VFOR_REAL", NULL);//Directive
- put("%VFOR", NULL);//Directive
- put("%REDUCTION_BY_SUM", NULL); //Directive
- put("%REDUCTION_BY_MAX", NULL); //Directive
- put("%REDUCTION_BY_MIN", NULL); //Directive
- put("%REDUCTION_BY_HYPOT", NULL); //Directive
- put("%REDUCTION_BY_SSQ", NULL); //Directive
- put("%VABS", NULL); //Directive
- put("%ABS", NULL); //Directive
-
- srand((unsigned int)time(NULL));
-
- return;
-}
-
-kprintf::kprintf(char _type, int vecWidth, bool doVLOAD, bool doVSTORE, int _wgSize)
-{
- this->dataType = _type;
- switch(_type)
- {
- case 'S':
- doConstruct("single", vecWidth, doVLOAD, doVSTORE, _wgSize);
- break;
- case 'D':
- doConstruct("double", vecWidth, doVLOAD, doVSTORE, _wgSize);
- break;
- case 'C':
- doConstruct("complex", vecWidth, doVLOAD, doVSTORE, _wgSize);
- break;
- case 'Z':
- doConstruct("doublecomplex", vecWidth, doVLOAD, doVSTORE, _wgSize);
- break;
- default:
- printf("WARNING: kprintf called with wrong arguments!\n");
- break;
- }
- return;
-}
-
-kprintf::kprintf(const char *type, int vecWidth, bool doVLOAD, bool doVSTORE, int _wgSize)
-{
- if (strcmp(type, "single") == 0)
- this->dataType = 'S';
- else if (strcmp(type, "double") == 0)
- this->dataType = 'D';
- else if (strcmp(type, "complex") == 0)
- this->dataType = 'C';
- else if (strcmp(type, "doublecomplex") == 0)
- this->dataType = 'Z';
-
- doConstruct(type, vecWidth, doVLOAD, doVSTORE, _wgSize);
- return;
-}
-
-void kprintf::put(const char *key, const char *value)
-{
- struct fmt f;
-
- if(key[0] != '%')
- {
- std::cout << "Addition of key " << key << " failed as it does not start with %" << std::endl;
- return;
- }
- f.key = key; f.value = value;
- if (strlen(key) > maxKeySize)
- {
- maxKeySize = strlen(key);
- }
- v.push_back(f);
- return;
-}
-
-//
-// PENDING:
-// Needs ammendment at a later point of time when we support MACROS
-//
-int kprintf::real_strlen(const char *src)
-{
- int length = 0;
- struct fmt f;
- while(src[0])
- {
- f = get(src);
- if (f.value != NULL)
- {
- length += (int)strlen(f.value);
- src += strlen(f.key);
- } else {
- length++;
- src++;
- }
- }
- return length+1; // +1 for the '\0' character
-}
-
-void kprintf::spit(char *dst, char *src)
-{
- struct fmt f;
-
- while(src[0])
- {
- f = get(src);
- if ((f.value != NULL) || (f.key != NULL))
- {
- if(f.value != NULL)
- {
- //
- // Normal Replacement Would Suffice
- //
- strncpy(dst, f.value, strlen(f.value));
- dst += strlen(f.value);
- src += strlen(f.key);
- } else {
- //
- // Directive - Function Like Macro
- //
- if( strcmp(f.key, "%MAD") == 0)
- {
- handleMAD(&src, &dst);
- }
- else if ( strcmp(f.key, "%VMAD") == 0)
- {
- handleMAD(&src, &dst, true);
- } else if ( strcmp(f.key, "%VMAD_AND_REDUCE") == 0)
- {
- handleVMAD_AND_REDUCE(&src, &dst);
- } else if ( strcmp(f.key, "%MAD_AND_REDUCE") == 0)
- {
- handleMAD_AND_REDUCE(&src, &dst);
- } else if ( strcmp(f.key, "%CONJUGATE") == 0)
- {
- handleCONJUGATE(&src, &dst);
- } else if ( strcmp(f.key, "%CLEAR_IMAGINARY") == 0)
- {
- handleClearImaginary(&src, &dst);
- }
- else if (strcmp(f.key, "%MUL") == 0)
- {
- handleMUL(&src, &dst);
- }
- else if (strcmp(f.key, "%VMUL") == 0)
- {
- handleMUL(&src, &dst, true);
- } else if (strcmp(f.key, "%ADD") == 0)
- {
- handleADD_SUB(&src, &dst, '+');
- }
- else if (strcmp(f.key, "%SUB") == 0)
- {
- handleADD_SUB(&src, &dst, '-');
- }
- else if (strcmp(f.key, "%DIV") == 0)
- {
- handleDIV(&src, &dst);
- } else if (strcmp(f.key, "%VDIV") == 0)
- {
- handleDIV(&src, &dst, true);
- } else if (strcmp(f.key, "%VMAKEVEC") == 0)
- {
- handleMakeVector(&src, &dst);
- } else if (strcmp(f.key, "%VMAKEHVEC") == 0)
- {
- handleMakeVector(&src, &dst, 2);
- } else if (strcmp(f.key, "%VMAKEQVEC") == 0)
- {
- handleMakeVector(&src, &dst, 4);
- } else if (strcmp(f.key, "%VMAKEOVEC") == 0)
- {
- handleMakeVector(&src, &dst, 8);
- } else if ((strcmp(f.key, "%MAKEVEC") == 0) || (strcmp(f.key, "%INIT") == 0) )
- {
- handleMakeVector(&src, &dst, 0); // To handle Scalar case
- } else if (strcmp(f.key, "%VLOADWITHINCX") == 0)
- {
- handleVLoadWithIncx(&src, &dst);
- }else if (strcmp(f.key, "%VLOADWITHINCXV2") == 0)
- {
- handleVLoadWithIncx(&src, &dst, true);
- } else if (strcmp(f.key, "%VSTOREWITHINCX") == 0)
- {
- handleVStoreWithIncx(&src, &dst);
- }else if (strcmp(f.key, "%REDUCE_SUM") == 0)
- {
- handleReduceSum(&src, &dst);
- } else if (strcmp(f.key, "%REDUCE_SUM_REAL_HV") == 0)
- {
- handleReduceSumReal(&src, &dst, effectiveVectorWidthOnBaseType/2);
- } else if (strcmp(f.key, "%REDUCE_MAX") == 0)
- {
- handleReduceMax(&src, &dst);
- } else if (strcmp(f.key, "%REDUCE_MIN") == 0)
- {
- handleReduceMin(&src, &dst);
- } else if (strcmp(f.key, "%REDUCE_HYPOT") == 0)
- {
- handleReduceHypot(&src, &dst);
- }else if (strcmp(f.key, "%VLOAD") == 0)
- {
- handleAlignedDataAccess(&src, &dst);
- }else if (strcmp(f.key, "%VSTORE") == 0)
- {
- handleAlignedVSTORE(&src, &dst);
- } else if (strcmp(f.key, "%IF") == 0)
- {
- handlePredicate(&src, &dst);
- } else if (strcmp(f.key, "%COMPLEX_JOIN") == 0)
- {
- handleComplexJoin(&src, &dst);
- } else if (strcmp(f.key, "%VFOR_REAL") == 0)
- {
- handleVFOR(&src, &dst, true);
- } else if (strcmp(f.key,"%VFOR") == 0)
- {
- handleVFOR(&src, &dst, false);
- } else if (strcmp(f.key,"%REDUCTION_BY_SUM") == 0)
- {
- handleReductionFramework(&src, &dst, REDUCTION_BY_SUM);
- } else if (strcmp(f.key,"%REDUCTION_BY_MAX") == 0)
- {
- handleReductionFramework(&src, &dst, REDUCTION_BY_MAX);
- } else if (strcmp(f.key,"%REDUCTION_BY_MIN") == 0)
- {
- handleReductionFramework(&src, &dst, REDUCTION_BY_MIN);
- } else if (strcmp(f.key,"%REDUCTION_BY_HYPOT") == 0)
- {
- handleReductionFramework(&src, &dst, REDUCTION_BY_HYPOT);
- } else if (strcmp(f.key,"%REDUCTION_BY_SSQ") == 0)
- {
- handleReductionFramework(&src, &dst, REDUCTION_BY_SSQ);
- } else if (strcmp(f.key,"%VABS") == 0)
- {
- handleVABS(&src, &dst);
- }
- else {
- std::cerr << "Problems in spitting: Internal error. Unable to handle key " << f.key << std::endl;
- *dst = *src;
- dst++;
- src++;
- }
- }
- } else {
- *dst = *src;
- dst++;
- src++;
- }
- }
- *dst = '\0';
-}
-
-