📄 smith_waterman_altivec.c
字号:
tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup2,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_zero,merge_score_load); // add score to H H = vec_adds(Hup1,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 7 // prefetch next residue k = db_sequence[7]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(v_score_q4, v_score_load1, queue4_to_queue3); v_score_q4 = vec_perm(v_score_q5, v_score_load1, queue5_to_queue4); v_score_q5 = vec_perm(v_score_q5, v_score_load1, queue5_with_load); // prefetch score for next step v_score_load1 = vec_ld(16*k,query_profile_byte); // load values of F and H from previous row (one unit up) Fup = vec_ld(0, p); Hup1 = vec_ld(16, p); p += 32; // move ahead 32 bytes // shift into place so we have complete F and H vectors // that refer to the values one unit up from each cell // that we are currently working on. Fup = vec_sld(Fup,F,15); Hup1 = vec_sld(Hup1,H,15); // do the dynamic programming // update E value E = vec_subs(E,v_gapextend); tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup1,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_zero,merge_score_load); // add score to H H = vec_adds(Hup2,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 8 // prefetch next residue k = db_sequence[8]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(v_score_q4, v_score_load1, queue4_to_queue3); v_score_q4 = vec_perm(v_score_q5, v_score_load1, queue5_to_queue4); v_score_q5 = vec_perm(v_score_q5, v_score_load1, queue5_with_load); // prefetch score for next step v_score_load1 = vec_ld(16*k,query_profile_byte); // load values of F and H from previous row (one unit up) Fup = vec_ld(0, p); Hup2 = vec_ld(16, p); p += 32; // move ahead 32 bytes // shift into place so we have complete F and H vectors // that refer to the values one unit up from each cell // that we are currently working on. Fup = vec_sld(Fup,F,15); Hup2 = vec_sld(Hup2,H,15); // do the dynamic programming // update E value E = vec_subs(E,v_gapextend); tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup2,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_score_load2,merge_score_load); // add score to H H = vec_adds(Hup1,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 9 // prefetch next residue k = db_sequence[9]; k8 = db_sequence[1]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(v_score_q4, v_score_load1, queue4_to_queue3); v_score_q4 = vec_perm(v_score_q5, v_score_load1, queue5_to_queue4); v_score_q5 = vec_perm(v_score_q5, v_score_load1, queue5_with_load); // prefetch score for next step v_score_load1 = vec_ld(16*k,query_profile_byte); v_score_load2 = vec_ld(16*k8,query_profile_byte); // load values of F and H from previous row (one unit up) Fup = vec_ld(0, p); Hup1 = vec_ld(16, p); p += 32; // move ahead 32 bytes // shift into place so we have complete F and H vectors // that refer to the values one unit up from each cell // that we are currently working on. Fup = vec_sld(Fup,F,15); Hup1 = vec_sld(Hup1,H,15); // do the dynamic programming // update E value E = vec_subs(E,v_gapextend); tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup1,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_score_load2,merge_score_load); // add score to H H = vec_adds(Hup2,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 10 // prefetch next residue k = db_sequence[10]; k8 = db_sequence[2]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(v_score_q4, v_score_load1, queue4_to_queue3); v_score_q4 = vec_perm(v_score_q5, v_score_load1, queue5_to_queue4); v_score_q5 = vec_perm(v_score_q5, v_score_load1, queue5_with_load); // prefetch score for next step v_score_load1 = vec_ld(16*k,query_profile_byte); v_score_load2 = vec_ld(16*k8,query_profile_byte); // load values of F and H from previous row (one unit up) Fup = vec_ld(0, p); Hup2 = vec_ld(16, p); p += 32; // move ahead 32 bytes // shift into place so we have complete F and H vectors // that refer to the values one unit up from each cell // that we are currently working on. Fup = vec_sld(Fup,F,15); Hup2 = vec_sld(Hup2,H,15); // do the dynamic programming // update E value E = vec_subs(E,v_gapextend); tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup2,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_score_load2,merge_score_load); // add score to H H = vec_adds(Hup1,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 11 // prefetch next residue k = db_sequence[11]; k8 = db_sequence[3]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(v_score_q4, v_score_load1, queue4_to_queue3); v_score_q4 = vec_perm(v_score_q5, v_score_load1, queue5_to_queue4); v_score_q5 = vec_perm(v_score_q5, v_score_load1, queue5_with_load); // prefetch score for next step v_score_load1 = vec_ld(16*k,query_profile_byte); v_score_load2 = vec_ld(16*k8,query_profile_byte); // load values of F and H from previous row (one unit up) Fup = vec_ld(0, p); Hup1 = vec_ld(16, p); p += 32; // move ahead 32 bytes // shift into place so we have complete F and H vectors // that refer to the values one unit up from each cell // that we are currently working on. Fup = vec_sld(Fup,F,15); Hup1 = vec_sld(Hup1,H,15); // do the dynamic programming // update E value E = vec_subs(E,v_gapextend); tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup1,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_score_load2,merge_score_load); // add score to H H = vec_adds(Hup2,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 12 // prefetch next residue k = db_sequence[12]; k8 = db_sequence[4]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(v_score_q4, v_score_load1, queue4_to_queue3); v_score_q4 = vec_perm(v_score_q5, v_score_load1, queue5_to_queue4); v_score_q5 = vec_perm(v_score_q5, v_score_load1, queue5_with_load); // prefetch score for next step v_score_load1 = vec_ld(16*k,query_profile_byte); v_score_load2 = vec_ld(16*k8,query_profile_byte); // load values of F and H from previous row (one unit up) Fup = vec_ld(0, p); Hup2 = vec_ld(16, p); p += 32; // move ahead 32 bytes // shift into place so we have complete F and H vectors // that refer to the values one unit up from each cell // that we are currently working on. Fup = vec_sld(Fup,F,15); Hup2 = vec_sld(Hup2,H,15); // do the dynamic programming // update E value E = vec_subs(E,v_gapextend); tmp = vec_subs(H,v_gapopen); E = vec_max(E,tmp); // update F value F = vec_subs(Fup,v_gapextend); tmp = vec_subs(Hup2,v_gapopen); F = vec_max(F,tmp); v_score_load1 = vec_perm(v_score_load1,v_score_load2,merge_score_load); // add score to H H = vec_adds(Hup1,v_score); H = vec_subs(H,v_bias); // set H to max of H,E,F H = vec_max(H,E); H = vec_max(H,F); // Update highest score encountered this far v_maxscore = vec_max(v_maxscore,H); // PROLOGUE 13 // prefetch next residue k = db_sequence[13]; k8 = db_sequence[5]; v_score = vec_perm(v_score_q1, v_score_load1, queue1_to_score); v_score_q1 = vec_perm(v_score_q2, v_score_load1, queue2_to_queue1); v_score_q2 = vec_perm(v_score_q3, v_score_load1, queue3_to_queue2); v_score_q3 = vec_perm(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -