/* Function: p7_gbands_Reverse() * Synopsis: Reverse the band structure arrays, after a backwards DP pass. * * Purpose: Our checkpointed DP posterior decoding algorithms that make a * band structure work backwards in rows from L..1, and so they * construct a <P7_GBANDS> structure that has its data elements * in reversed order. Before we can use that structure, we have * to reverse these arrays. * * Args: bnd - band list to reverse. * * Returns: <eslOK> on success. */ int p7_gbands_Reverse(P7_GBANDS *bnd) { esl_vec_IReverse(bnd->imem, bnd->imem, 2*bnd->nseg); esl_vec_IReverse(bnd->kmem, bnd->kmem, 2*bnd->nrow); return eslOK; }
int p7_sparsemask_Finish_avx512(P7_SPARSEMASK *sm) { #ifdef HAVE_AVX512 int i,r; int s; int status; //printf("calling p7_sparsemask_Finish, sm->ncells = %li\n", sm->ncells); /* Reverse kmem. */ int *p_AVX_512; esl_vec_IReverse(sm->kmem_AVX_512, sm->kmem_AVX_512, sm->ncells_AVX_512); /* Set the k[] pointers; count <S> and <nrow> */ p_AVX_512 = sm->kmem_AVX_512; sm->S_AVX_512 = sm->nrow_AVX_512 = 0; for (i = 1; i <= sm->L; i++){ if (sm->n_AVX_512[i]) { sm->nrow_AVX_512++; sm->k_AVX_512[i] = p_AVX_512; p_AVX_512 += sm->n_AVX_512[i]; if (sm->n_AVX_512[i-1] == 0) sm->S_AVX_512++; } else sm->k_AVX_512[i] = NULL; } /* Reallocate seg[] if needed. */ if ( (sm->S_AVX_512+2) > sm->salloc_AVX_512) { ESL_REALLOC(sm->seg_AVX_512, (sm->S_AVX_512+2) * sizeof(p7_sparsemask_seg_s)); /* +2, for sentinels */ sm->salloc_AVX_512 = sm->S_AVX_512 + 2; // inclusive of sentinels sm->n_srealloc++; } /* Set seg[] coord pairs. */ sm->seg_AVX_512[0].ia = sm->seg_AVX_512[0].ib = -1; for (s = 1, i = 1; i <= sm->L; i++) { if (sm->n_AVX_512[i] && sm->n_AVX_512[i-1] == 0) sm->seg_AVX_512[s].ia = i; if (sm->n_AVX_512[i] && (i == sm->L || sm->n_AVX_512[i+1] == 0)) sm->seg_AVX_512[s++].ib = i; } ESL_DASSERT1(( s == sm->S_AVX_512+1 )); sm->seg_AVX_512[s].ia = sm->seg_AVX_512[s].ib = sm->L+2; sm->last_i_AVX_512 = -1; for (r = 0; r < p7_VNF_AVX_512; r++) sm->last_k_AVX_512[r] = -1; // if we're running AVX-512 code and not SSE, need to copy some values into the SSE data structure // so the downstream code will see them sm->seg = sm->seg_AVX_512; sm->k = sm->k_AVX_512; sm->n = sm->n_AVX_512; sm->kmem = sm->kmem_AVX_512; sm->S = sm->S_AVX_512; sm->nrow = sm->nrow_AVX_512; sm->ncells = sm->ncells_AVX_512; return eslOK; ERROR: return eslEMEM; #endif #ifndef HAVE_AVX512 return eslENORESULT; #endif }