/** * @file * * @author jeff.daily@pnnl.gov * * Copyright (c) 2015 Battelle Memorial Institute. */ #include "config.h" #include #include #include %(HEADER)s #include "parasail.h" #include "parasail/memory.h" #include "parasail/internal_%(ISA)s.h" #define NEG_INF %(NEG_INF)s %(FIXES)s #ifdef PARASAIL_TABLE static inline void arr_store_si%(BITS)s( int *array, %(VTYPE)s vH, %(INDEX)s t, %(INDEX)s seglen, %(INDEX)s d, %(INDEX)s dlen, %(INDEX)s bias) { %(PRINTER_BIAS)s } #endif #ifdef PARASAIL_ROWCOL static inline void arr_store_col( int *col, %(VTYPE)s vH, %(INDEX)s t, %(INDEX)s seglen, %(INDEX)s bias) { %(PRINTER_BIAS_ROWCOL)s } #endif #ifdef PARASAIL_TABLE #define FNAME %(NAME_TABLE)s #define PNAME %(PNAME_TABLE)s #else #ifdef PARASAIL_ROWCOL #define FNAME %(NAME_ROWCOL)s #define PNAME %(PNAME_ROWCOL)s #else #define FNAME %(NAME)s #define PNAME %(PNAME)s #endif #endif parasail_result_t* FNAME( const char * const restrict s1, const int s1Len, const char * const restrict s2, const int s2Len, const int open, const int gap, const parasail_matrix_t *matrix) { parasail_profile_t *profile = parasail_profile_create_%(ISA)s_%(BITS)s_%(WIDTH)s(s1, s1Len, matrix); parasail_result_t *result = PNAME(profile, s2, s2Len, open, gap); parasail_profile_free(profile); return result; } parasail_result_t* PNAME( const parasail_profile_t * const restrict profile, const char * const restrict s2, const int s2Len, const int open, const int gap) { %(INDEX)s i = 0; %(INDEX)s j = 0; %(INDEX)s k = 0; %(INDEX)s end_query = 0; %(INDEX)s end_ref = 0; const int s1Len = profile->s1Len; const parasail_matrix_t *matrix = profile->matrix; const %(INDEX)s segWidth = %(LANES)s; /* number of values in vector unit */ const %(INDEX)s segLen = (s1Len + segWidth - 1) / segWidth; %(VTYPE)s* const restrict vProfile = (%(VTYPE)s*)profile->profile%(WIDTH)s.score; %(VTYPE)s* restrict pvHStore = parasail_memalign_%(VTYPE)s(%(ALIGNMENT)s, segLen); %(VTYPE)s* restrict pvHLoad = parasail_memalign_%(VTYPE)s(%(ALIGNMENT)s, segLen); %(VTYPE)s* restrict pvHMax = parasail_memalign_%(VTYPE)s(%(ALIGNMENT)s, segLen); %(VTYPE)s* const restrict pvE = parasail_memalign_%(VTYPE)s(%(ALIGNMENT)s, segLen); %(VTYPE)s vGapO = %(VSET1)s(open); %(VTYPE)s vGapE = %(VSET1)s(gap); %(VTYPE)s vZero = %(VSET1)s(0); %(INT)s bias = INT%(WIDTH)s_MIN; %(INT)s score = bias; %(VTYPE)s vBias = %(VSET1)s(bias); %(VTYPE)s vMaxH = vBias; %(VTYPE)s vMaxHUnit = vBias; %(INT)s maxp = INT%(WIDTH)s_MAX - (%(INT)s)(matrix->max+1); %(VTYPE)s insert_mask = %(VCMPGT)s( %(VSET)s(%(STRIPED_INSERT_MASK)s), vZero); /*%(INT)s stop = profile->stop == INT32_MAX ? INT%(WIDTH)s_MAX : (%(INT)s)profile->stop-bias;*/ #ifdef PARASAIL_TABLE parasail_result_t *result = parasail_result_new_table1(segLen*segWidth, s2Len); #else #ifdef PARASAIL_ROWCOL parasail_result_t *result = parasail_result_new_rowcol1(segLen*segWidth, s2Len); const %(INDEX)s offset = (s1Len - 1) %% segLen; const %(INDEX)s position = (segWidth - 1) - (s1Len - 1) / segLen; #else parasail_result_t *result = parasail_result_new(); #endif #endif /* initialize H and E */ parasail_memset_%(VTYPE)s(pvHStore, vBias, segLen); parasail_memset_%(VTYPE)s(pvE, vBias, segLen); /* outer loop over database sequence */ for (j=0; jmapper[(unsigned char)s2[j]] * segLen; if (end_ref == j-2) { /* Swap in the max buffer. */ pv = pvHMax; pvHMax = pvHLoad; pvHLoad = pvHStore; pvHStore = pv; } else { /* Swap the 2 H buffers. */ pv = pvHLoad; pvHLoad = pvHStore; pvHStore = pv; } /* inner loop to process the query sequence */ for (i=0; iscore_table, vH, i, segLen, j, s2Len, bias); #endif vMaxH = %(VMAX)s(vH, vMaxH); /* Update vE value. */ vH = %(VSUB)s(vH, vGapO); vE = %(VSUB)s(vE, vGapE); vE = %(VMAX)s(vE, vH); %(VSTORE)s(pvE + i, vE); /* Update vF value. */ vF = %(VSUB)s(vF, vGapE); vF = %(VMAX)s(vF, vH); /* Load the next vH. */ vH = %(VLOAD)s(pvHLoad + i); } /* Lazy_F loop: has been revised to disallow adjecent insertion and * then deletion, so don't update E(i, i), learn from SWPS3 */ for (k=0; kscore_table, vH, i, segLen, j, s2Len, bias); #endif vMaxH = %(VMAX)s(vH, vMaxH); vH = %(VSUB)s(vH, vGapO); vF = %(VSUB)s(vF, vGapE); if (! %(VMOVEMASK)s(%(VCMPGT)s(vF, vH))) goto end; /*vF = %(VMAX)s(vF, vH);*/ } } end: { } #ifdef PARASAIL_ROWCOL /* extract last value from the column */ { vH = %(VLOAD)s(pvHStore + offset); for (k=0; kscore_row[j] = (%(INT)s) %(VEXTRACT)s (vH, %(LAST_POS)s) - bias; } #endif { %(VTYPE)s vCompare = %(VCMPGT)s(vMaxH, vMaxHUnit); if (%(VMOVEMASK)s(vCompare)) { score = %(VHMAX)s(vMaxH); /* if score has potential to overflow, abort early */ if (score > maxp) { result->saturated = 1; break; } vMaxHUnit = %(VSET1)s(score); end_ref = j; } } /*if (score == stop) break;*/ } #ifdef PARASAIL_ROWCOL for (i=0; iscore_col, vH, i, segLen, bias); } #endif if (score == INT%(WIDTH)s_MAX) { result->saturated = 1; } if (result->saturated) { score = INT%(WIDTH)s_MAX; end_query = 0; end_ref = 0; } else { if (end_ref == j-1) { /* end_ref was the last store column */ %(VTYPE)s *pv = pvHMax; pvHMax = pvHStore; pvHStore = pv; } else if (end_ref == j-2) { /* end_ref was the last load column */ %(VTYPE)s *pv = pvHMax; pvHMax = pvHLoad; pvHLoad = pv; } /* Trace the alignment ending position on read. */ { %(INT)s *t = (%(INT)s*)pvHMax; %(INDEX)s column_len = segLen * segWidth; end_query = s1Len - 1; for (i = 0; iscore = score - bias; result->end_query = end_query; result->end_ref = end_ref; parasail_free(pvE); parasail_free(pvHMax); parasail_free(pvHLoad); parasail_free(pvHStore); return result; }