解决了读文件的bug,原因是target有些行是0,没有碱基,保留了测试代码
This commit is contained in:
parent
395b2e598d
commit
c04c6541ef
8
Makefile
8
Makefile
|
|
@ -1,9 +1,10 @@
|
||||||
CC= gcc
|
CC= gcc
|
||||||
#CFLAGS= -g -Wall -Wno-unused-function -mavx2
|
#CFLAGS= -g -Wall -Wno-unused-function -mavx2
|
||||||
CFLAGS= -Wall -Wno-unused-function -O2 -mavx2
|
CFLAGS= -Wall -Wno-unused-function -O2 -mavx2
|
||||||
DFLAGS= -DSHOW_PERF
|
DFLAGS= -DSHOW_PERF -DDEBUG_RETURN_VALUE
|
||||||
#DFLAGS= -DSHOW_PERF -DDEBUG_OUT -DDEBUG_RETURN_VALUE
|
#DFLAGS= -DSHOW_PERF -DDEBUG_OUT -DDEBUG_RETURN_VALUE
|
||||||
PROG= sw_perf
|
PROG= sw_perf
|
||||||
|
PROG2= get_line
|
||||||
INCLUDES=
|
INCLUDES=
|
||||||
LIBS=
|
LIBS=
|
||||||
SUBDIRS= .
|
SUBDIRS= .
|
||||||
|
|
@ -30,9 +31,12 @@ endif
|
||||||
|
|
||||||
all:$(PROG)
|
all:$(PROG)
|
||||||
|
|
||||||
sw_perf:$(OBJS) main.o
|
$(PROG):$(OBJS) main.o
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) main.o -o $@ -L. $(LIBS)
|
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) main.o -o $@ -L. $(LIBS)
|
||||||
|
|
||||||
|
$(PROG2): get_line.o
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) get_line.o -o $@ -L. $(LIBS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o a.out $(PROG) *~ *.a
|
rm -f *.o a.out $(PROG) *~ *.a
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*********************************************************************************************
|
||||||
|
Description: Get specific line of a txt file
|
||||||
|
|
||||||
|
Copyright : All right reserved by NCIC.ICT
|
||||||
|
|
||||||
|
Author : Zhang Zhonghai
|
||||||
|
Date : 2023/08/28
|
||||||
|
***********************************************************************************************/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define READ_BUF_SIZE 102400000
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if (argc < 3)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Please input the file path and the line number you want to get!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const char *in_path = argv[1];
|
||||||
|
size_t expect_line_num = atoi(argv[2]);
|
||||||
|
FILE *in_f = fopen(in_path, "r");
|
||||||
|
char *read_buf = (char *)malloc(READ_BUF_SIZE);
|
||||||
|
|
||||||
|
int actual_size = 0;
|
||||||
|
int expect_size = READ_BUF_SIZE;
|
||||||
|
size_t cur_line_num = 0;
|
||||||
|
size_t last_line_pos = 0;
|
||||||
|
size_t cur_line_pos = 0;
|
||||||
|
int i, j;
|
||||||
|
int flag_found = 0;
|
||||||
|
// 读取数据
|
||||||
|
actual_size = fread(read_buf, 1, expect_size, in_f);
|
||||||
|
while (actual_size > 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < actual_size; ++i)
|
||||||
|
if (read_buf[i] == '\n')
|
||||||
|
{
|
||||||
|
cur_line_num += 1;
|
||||||
|
last_line_pos = cur_line_pos;
|
||||||
|
cur_line_pos = i;
|
||||||
|
if (cur_line_num == expect_line_num)
|
||||||
|
{
|
||||||
|
for (j = last_line_pos + 1; j <= cur_line_pos; ++j)
|
||||||
|
{
|
||||||
|
fprintf(stdout, "%c", read_buf[j]);
|
||||||
|
}
|
||||||
|
flag_found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (flag_found)
|
||||||
|
break;
|
||||||
|
actual_size = fread(read_buf, 1, expect_size, in_f);
|
||||||
|
}
|
||||||
|
if (!flag_found)
|
||||||
|
fprintf(stderr, "Invalid line number!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -289,6 +289,13 @@ int ksw_extend_avx2(thread_mem_t *tmem,
|
||||||
int16_t ins[tlen + 1][qlen + 2];
|
int16_t ins[tlen + 1][qlen + 2];
|
||||||
int16_t del[tlen + 1][qlen + 2];
|
int16_t del[tlen + 1][qlen + 2];
|
||||||
int16_t score[tlen + 1][qlen + 2];
|
int16_t score[tlen + 1][qlen + 2];
|
||||||
|
for (dii = 0; dii <= tlen; ++dii)
|
||||||
|
{
|
||||||
|
for (djj = 0; djj <= qlen; ++djj)
|
||||||
|
{
|
||||||
|
ins[dii][djj] = del[dii][djj] = score[dii][djj] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
ins[0][0] = del[0][0] = score[0][0] = init_score;
|
ins[0][0] = del[0][0] = score[0][0] = init_score;
|
||||||
ins[0][1] = MAX(0, init_score - (o_ins + e_ins));
|
ins[0][1] = MAX(0, init_score - (o_ins + e_ins));
|
||||||
del[1][0] = MAX(0, init_score - (o_del + e_del));
|
del[1][0] = MAX(0, init_score - (o_del + e_del));
|
||||||
|
|
@ -307,16 +314,15 @@ int ksw_extend_avx2(thread_mem_t *tmem,
|
||||||
end1 = D; // 闭区间
|
end1 = D; // 闭区间
|
||||||
else
|
else
|
||||||
end1 = qlen;
|
end1 = qlen;
|
||||||
beg1 = MAX(D - window_size, beg1);
|
// beg1 = MAX(D - window_size, beg1);
|
||||||
end1 = MIN(D + window_size, end1);
|
// end1 = MIN(D + window_size, end1);
|
||||||
|
// beg = MAX(beg1, beg);
|
||||||
|
// end = MIN(end1, end);
|
||||||
|
// if (beg > end)
|
||||||
|
// break;
|
||||||
|
|
||||||
beg = MAX(beg1, beg);
|
beg = beg1;
|
||||||
end = MIN(end1, end);
|
end = end1;
|
||||||
if (beg > end)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// beg = beg1;
|
|
||||||
// end = end1;
|
|
||||||
|
|
||||||
iend = D - beg; // ref开始计算的位置,倒序
|
iend = D - beg; // ref开始计算的位置,倒序
|
||||||
span = end - beg;
|
span = end - beg;
|
||||||
|
|
@ -415,20 +421,20 @@ int ksw_extend_avx2(thread_mem_t *tmem,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 调整计算的边界
|
// 调整计算的边界
|
||||||
for (j = beg; LIKELY(j <= end); ++j)
|
// for (j = beg; LIKELY(j <= end); ++j)
|
||||||
{
|
//{
|
||||||
int has_val = hA1[j - 1] | hA2[j];
|
// int has_val = hA1[j - 1] | hA2[j];
|
||||||
if (has_val)
|
// if (has_val)
|
||||||
break;
|
// break;
|
||||||
}
|
//}
|
||||||
beg = j;
|
// beg = j;
|
||||||
for (j = end + 1; LIKELY(j >= beg); --j)
|
// for (j = end + 1; LIKELY(j >= beg); --j)
|
||||||
{
|
//{
|
||||||
int has_val = hA1[j - 1] | hA2[j];
|
// int has_val = hA1[j - 1] | hA2[j];
|
||||||
if (has_val)
|
// if (has_val)
|
||||||
break;
|
// break;
|
||||||
}
|
//}
|
||||||
end = j + 1 <= qlen ? j + 1 : qlen;
|
// end = j + 1 <= qlen ? j + 1 : qlen;
|
||||||
// beg = 0;
|
// beg = 0;
|
||||||
// end = qlen; // uncomment this line for debugging
|
// end = qlen; // uncomment this line for debugging
|
||||||
|
|
||||||
|
|
@ -441,9 +447,9 @@ int ksw_extend_avx2(thread_mem_t *tmem,
|
||||||
{
|
{
|
||||||
for (djj = 0; djj <= qlen; ++djj)
|
for (djj = 0; djj <= qlen; ++djj)
|
||||||
{
|
{
|
||||||
fprintf(score_f_arr[1], "%-3d", score[dii][djj]);
|
fprintf(score_f_arr[1], "%-4d", score[dii][djj]);
|
||||||
fprintf(ins_ext_f_arr[1], "%-3d", ins[dii][djj]);
|
fprintf(ins_ext_f_arr[1], "%-4d", ins[dii][djj]);
|
||||||
fprintf(del_ext_f_arr[1], "%-3d", del[dii][djj]);
|
fprintf(del_ext_f_arr[1], "%-4d", del[dii][djj]);
|
||||||
}
|
}
|
||||||
fprintf(score_f_arr[1], "\n");
|
fprintf(score_f_arr[1], "\n");
|
||||||
fprintf(ins_ext_f_arr[1], "\n");
|
fprintf(ins_ext_f_arr[1], "\n");
|
||||||
|
|
|
||||||
|
|
@ -317,16 +317,15 @@ int ksw_extend_avx2_u8(thread_mem_t *tmem,
|
||||||
end1 = D; // 闭区间
|
end1 = D; // 闭区间
|
||||||
else
|
else
|
||||||
end1 = qlen;
|
end1 = qlen;
|
||||||
beg1 = MAX(D - window_size, beg1);
|
// beg1 = MAX(D - window_size, beg1);
|
||||||
end1 = MIN(D + window_size, end1);
|
// end1 = MIN(D + window_size, end1);
|
||||||
|
// beg = MAX(beg1, beg);
|
||||||
|
// end = MIN(end1, end);
|
||||||
|
// if (beg > end)
|
||||||
|
// break;
|
||||||
|
|
||||||
beg = MAX(beg1, beg);
|
beg = beg1;
|
||||||
end = MIN(end1, end);
|
end = end1;
|
||||||
if (beg > end)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// beg = beg1;
|
|
||||||
// end = end1;
|
|
||||||
|
|
||||||
iend = D - beg; // ref开始计算的位置,倒序
|
iend = D - beg; // ref开始计算的位置,倒序
|
||||||
span = end - beg;
|
span = end - beg;
|
||||||
|
|
@ -394,22 +393,22 @@ int ksw_extend_avx2_u8(thread_mem_t *tmem,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 调整计算的边界
|
// 调整计算的边界
|
||||||
for (j = beg; LIKELY(j <= end); ++j)
|
// for (j = beg; LIKELY(j <= end); ++j)
|
||||||
{
|
//{
|
||||||
int has_val = hA1[j - 1] | hA2[j];
|
// int has_val = hA1[j - 1] | hA2[j];
|
||||||
if (has_val)
|
// if (has_val)
|
||||||
break;
|
// break;
|
||||||
}
|
//}
|
||||||
beg = j;
|
// beg = j;
|
||||||
for (j = end + 1; LIKELY(j >= beg); --j)
|
// for (j = end + 1; LIKELY(j >= beg); --j)
|
||||||
{
|
//{
|
||||||
int has_val = hA1[j - 1] | hA2[j];
|
// int has_val = hA1[j - 1] | hA2[j];
|
||||||
if (has_val)
|
// if (has_val)
|
||||||
break;
|
// break;
|
||||||
else
|
// else
|
||||||
hA0[j - 1] = 0;
|
// hA0[j - 1] = 0;
|
||||||
}
|
//}
|
||||||
end = j + 1 <= qlen ? j + 1 : qlen;
|
// end = j + 1 <= qlen ? j + 1 : qlen;
|
||||||
|
|
||||||
// swap m, h, e, f
|
// swap m, h, e, f
|
||||||
SWAP_DATA_POINTER;
|
SWAP_DATA_POINTER;
|
||||||
|
|
|
||||||
|
|
@ -58,14 +58,14 @@ int ksw_extend_normal(thread_mem_t *tmem, int qlen, const uint8_t *query, int tl
|
||||||
max_off = 0;
|
max_off = 0;
|
||||||
beg = 0, end = qlen;
|
beg = 0, end = qlen;
|
||||||
#ifdef DEBUG_OUT
|
#ifdef DEBUG_OUT
|
||||||
fprintf(score_f_arr[0], "%-3d", h0);
|
fprintf(score_f_arr[0], "%-4d", h0);
|
||||||
fprintf(ins_ext_f_arr[0], "%-3d", h0);
|
fprintf(ins_ext_f_arr[0], "%-4d", h0);
|
||||||
fprintf(del_ext_f_arr[0], "%-3d", h0);
|
fprintf(del_ext_f_arr[0], "%-4d", h0);
|
||||||
for (j = 0; LIKELY(j < end); ++j) // 遍历query字符序列
|
for (j = 0; LIKELY(j < end); ++j) // 遍历query字符序列
|
||||||
{
|
{
|
||||||
fprintf(score_f_arr[0], "%-3d", MAX(h0 - o_ins - (j + 1) * e_ins, 0));
|
fprintf(score_f_arr[0], "%-4d", MAX(h0 - o_ins - (j + 1) * e_ins, 0));
|
||||||
fprintf(ins_ext_f_arr[0], "%-3d", MAX(h0 - o_ins - (j + 1) * e_ins, 0));
|
fprintf(ins_ext_f_arr[0], "%-4d", MAX(h0 - o_ins - (j + 1) * e_ins, 0));
|
||||||
fprintf(del_ext_f_arr[0], "%-3d", 0);
|
fprintf(del_ext_f_arr[0], "%-4d", 0);
|
||||||
}
|
}
|
||||||
fprintf(score_f_arr[0], "\n");
|
fprintf(score_f_arr[0], "\n");
|
||||||
fprintf(ins_ext_f_arr[0], "\n");
|
fprintf(ins_ext_f_arr[0], "\n");
|
||||||
|
|
@ -83,8 +83,8 @@ int ksw_extend_normal(thread_mem_t *tmem, int qlen, const uint8_t *query, int tl
|
||||||
end = i + w + 1;
|
end = i + w + 1;
|
||||||
if (end > qlen) // 终点不超过query长度
|
if (end > qlen) // 终点不超过query长度
|
||||||
end = qlen;
|
end = qlen;
|
||||||
// beg = 0;
|
beg = 0;
|
||||||
// end = qlen;
|
end = qlen;
|
||||||
// compute the first column
|
// compute the first column
|
||||||
if (beg == 0)
|
if (beg == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -95,15 +95,15 @@ int ksw_extend_normal(thread_mem_t *tmem, int qlen, const uint8_t *query, int tl
|
||||||
else
|
else
|
||||||
h1 = 0;
|
h1 = 0;
|
||||||
#ifdef DEBUG_OUT
|
#ifdef DEBUG_OUT
|
||||||
fprintf(ins_ext_f_arr[0], "%-3d", 0);
|
fprintf(ins_ext_f_arr[0], "%-4d", 0);
|
||||||
fprintf(del_ext_f_arr[0], "%-3d", MAX(h0 - o_del - (i + 1) * e_del, 0));
|
fprintf(del_ext_f_arr[0], "%-4d", MAX(h0 - o_del - (i + 1) * e_del, 0));
|
||||||
#endif
|
#endif
|
||||||
for (j = beg; LIKELY(j < end); ++j) // 遍历query字符序列
|
for (j = beg; LIKELY(j < end); ++j) // 遍历query字符序列
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_OUT
|
#ifdef DEBUG_OUT
|
||||||
fprintf(score_f_arr[0], "%-3d", h1);
|
fprintf(score_f_arr[0], "%-4d", h1);
|
||||||
fprintf(ins_ext_f_arr[0], "%-3d", f);
|
fprintf(ins_ext_f_arr[0], "%-4d", f);
|
||||||
fprintf(del_ext_f_arr[0], "%-3d", eh[j].e);
|
fprintf(del_ext_f_arr[0], "%-4d", eh[j].e);
|
||||||
#endif
|
#endif
|
||||||
// At the beginning of the loop: eh[j] = { H(i-1,j-1), E(i,j) }, f = F(i,j) and h1 = H(i,j-1)
|
// At the beginning of the loop: eh[j] = { H(i-1,j-1), E(i,j) }, f = F(i,j) and h1 = H(i,j-1)
|
||||||
// Similar to SSE2-SW, cells are computed in the following order:
|
// Similar to SSE2-SW, cells are computed in the following order:
|
||||||
|
|
@ -130,7 +130,7 @@ int ksw_extend_normal(thread_mem_t *tmem, int qlen, const uint8_t *query, int tl
|
||||||
f = f > t ? f : t; // computed F(i,j+1)
|
f = f > t ? f : t; // computed F(i,j+1)
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_OUT
|
#ifdef DEBUG_OUT
|
||||||
fprintf(score_f_arr[0], "%-3d", h1);
|
fprintf(score_f_arr[0], "%-4d", h1);
|
||||||
fprintf(score_f_arr[0], "\n");
|
fprintf(score_f_arr[0], "\n");
|
||||||
fprintf(ins_ext_f_arr[0], "\n");
|
fprintf(ins_ext_f_arr[0], "\n");
|
||||||
fprintf(del_ext_f_arr[0], "\n");
|
fprintf(del_ext_f_arr[0], "\n");
|
||||||
|
|
@ -142,8 +142,8 @@ int ksw_extend_normal(thread_mem_t *tmem, int qlen, const uint8_t *query, int tl
|
||||||
max_ie = gscore > h1 ? max_ie : i; // max_ie表示取得全局最大分值时,target字符串的位置
|
max_ie = gscore > h1 ? max_ie : i; // max_ie表示取得全局最大分值时,target字符串的位置
|
||||||
gscore = gscore > h1 ? gscore : h1;
|
gscore = gscore > h1 ? gscore : h1;
|
||||||
}
|
}
|
||||||
if (m == 0) // 遍历完query之后,当前轮次的最大分值为0,则跳出循环
|
// if (m == 0) // 遍历完query之后,当前轮次的最大分值为0,则跳出循环
|
||||||
break;
|
// break;
|
||||||
if (m > max) // 当前轮最大分值大于之前的最大分值
|
if (m > max) // 当前轮最大分值大于之前的最大分值
|
||||||
{
|
{
|
||||||
max = m, max_i = i, max_j = mj; // 更新取得最大值的target和query的位置
|
max = m, max_i = i, max_j = mj; // 更新取得最大值的target和query的位置
|
||||||
|
|
@ -163,15 +163,15 @@ int ksw_extend_normal(thread_mem_t *tmem, int qlen, const uint8_t *query, int tl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update beg and end for the next round
|
// update beg and end for the next round
|
||||||
for (j = beg; LIKELY(j < end) && eh[j].h == 0 && eh[j].e == 0; ++j)
|
// for (j = beg; LIKELY(j < end) && eh[j].h == 0 && eh[j].e == 0; ++j)
|
||||||
;
|
// ;
|
||||||
beg = j;
|
// beg = j;
|
||||||
for (j = end; LIKELY(j >= beg) && eh[j].h == 0 && eh[j].e == 0; --j)
|
// for (j = end; LIKELY(j >= beg) && eh[j].h == 0 && eh[j].e == 0; --j)
|
||||||
;
|
// ;
|
||||||
end = j + 2 < qlen ? j + 2 : qlen; // 剪枝没考虑f,即insert
|
// end = j + 2 < qlen ? j + 2 : qlen; // 剪枝没考虑f,即insert
|
||||||
// beg = 0, end = qlen; // uncomment this line for debugging
|
// beg = 0, end = qlen; // uncomment this line for debugging
|
||||||
// fprintf(stderr, "\n");
|
// fprintf(stderr, "\n");
|
||||||
// fprintf(stderr, "%d\n", end);
|
// fprintf(stderr, "%d\n", end);
|
||||||
}
|
}
|
||||||
// free(eh);
|
// free(eh);
|
||||||
// free(qp);
|
// free(qp);
|
||||||
|
|
|
||||||
116
main.c
116
main.c
|
|
@ -1,3 +1,11 @@
|
||||||
|
/*********************************************************************************************
|
||||||
|
Description: The entry for sw performance tests
|
||||||
|
|
||||||
|
Copyright : All right reserved by NCIC.ICT
|
||||||
|
|
||||||
|
Author : Zhang Zhonghai
|
||||||
|
Date : 2023/08/20
|
||||||
|
***********************************************************************************************/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -31,10 +39,43 @@ int64_t time_sw[KERNEL_NUM] = {0};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_RETURN_VALUE
|
#ifdef DEBUG_RETURN_VALUE
|
||||||
#define OUTPUT_RETVAL(kernel_num) \
|
#define OUTPUT_RETVAL_1(kernel_num) \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "%d\t%d\t%d\t%d\t", score[kernel_num], info_arr[i][0], info_arr[i][1], info_arr[i][2]); \
|
||||||
|
for (j = cur_query_pos - info_arr[i][0]; j < cur_query_pos; ++j) \
|
||||||
|
{ \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "%c", t_2bit2char[(uint8_t)query_arr[j]]); \
|
||||||
|
} \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "\t"); \
|
||||||
|
for (j = cur_target_pos - info_arr[i][1]; j < cur_target_pos; ++j) \
|
||||||
|
{ \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "%c", t_2bit2char[(uint8_t)target_arr[j]]); \
|
||||||
|
} \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "\n");
|
||||||
|
|
||||||
|
#define OUTPUT_RETVAL_SCORE \
|
||||||
fprintf(retval_f_arr[kernel_num], "%d\t%d\t%d\t%d\t%d\t%d\n", score[kernel_num], qle, tle, gtle, gscore, max_off[0])
|
fprintf(retval_f_arr[kernel_num], "%d\t%d\t%d\t%d\t%d\t%d\n", score[kernel_num], qle, tle, gtle, gscore, max_off[0])
|
||||||
|
// fprintf(retval_f_arr[kernel_num], " %d %d\n", cur_query_pos, info_arr[i][0]);
|
||||||
|
// fprintf(retval_f_arr[kernel_num], "%d\t%d\t%d\t%d\n", score[kernel_num], info_arr[i][0], info_arr[i][1], info_arr[i][2])
|
||||||
|
|
||||||
|
#define OUTPUT_RETVAL_target(kernel_num) \
|
||||||
|
for (j = cur_target_pos - info_arr[i][1]; j < cur_target_pos; ++j) \
|
||||||
|
{ \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "%c", t_2bit2char[(uint8_t)target_arr[j]]); \
|
||||||
|
} \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "\n");
|
||||||
|
|
||||||
|
#define OUTPUT_RETVAL_query(kernel_num) \
|
||||||
|
for (j = cur_query_pos - info_arr[i][0]; j < cur_query_pos; ++j) \
|
||||||
|
{ \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "%c", t_2bit2char[(uint8_t)query_arr[j]]); \
|
||||||
|
} \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "\n");
|
||||||
|
|
||||||
|
#define OUTPUT_RETVAL_INFO(kernel_num) \
|
||||||
|
fprintf(retval_f_arr[kernel_num], "%-8d%-8d%-8d\n", info_arr[i][0], info_arr[i][1], info_arr[i][2]);
|
||||||
|
#define OUTPUT_RETVAL(kernel_num) OUTPUT_RETVAL_target(kernel_num)
|
||||||
#else
|
#else
|
||||||
#define OUTPUT_RETVAL(out_f)
|
#define OUTPUT_RETVAL(kernel_num)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _PERFORMANCE_TEST_NORMAL(kernel_num, func) \
|
#define _PERFORMANCE_TEST_NORMAL(kernel_num, func) \
|
||||||
|
|
@ -78,16 +119,24 @@ int64_t time_sw[KERNEL_NUM] = {0};
|
||||||
cur_target_pos += info_arr[i][1]; \
|
cur_target_pos += info_arr[i][1]; \
|
||||||
OUTPUT_RETVAL(kernel_num); \
|
OUTPUT_RETVAL(kernel_num); \
|
||||||
}
|
}
|
||||||
|
#define _PERFORMANCE_TEST_AVX2_T1(kernel_num, func) \
|
||||||
|
cur_query_pos = 0; \
|
||||||
|
cur_target_pos = 0; \
|
||||||
|
for (i = 0; i < block_line_num; ++i) \
|
||||||
|
{ \
|
||||||
|
cur_query_pos += info_arr[i][0]; \
|
||||||
|
cur_target_pos += info_arr[i][1]; \
|
||||||
|
OUTPUT_RETVAL(kernel_num); \
|
||||||
|
}
|
||||||
#ifdef SHOW_PERF
|
#ifdef SHOW_PERF
|
||||||
#define PERFORMANCE_TEST_NORMAL(kernel_num, func) \
|
#define PERFORMANCE_TEST_NORMAL(kernel_num, func) \
|
||||||
start_time = get_mseconds(); \
|
start_time = get_mseconds(); \
|
||||||
_PERFORMANCE_TEST_NORMAL(kernel_num, func); \
|
_PERFORMANCE_TEST_NORMAL(kernel_num, func); \
|
||||||
time_sw[kernel_num] += get_mseconds() - start_time
|
time_sw[kernel_num] += get_mseconds() - start_time
|
||||||
|
|
||||||
#define PERFORMANCE_TEST_AVX2(kernel_num, func) \
|
#define PERFORMANCE_TEST_AVX2(kernel_num, func) \
|
||||||
start_time = get_mseconds(); \
|
start_time = get_mseconds(); \
|
||||||
_PERFORMANCE_TEST_AVX2(kernel_num, func); \
|
_PERFORMANCE_TEST_AVX2_T1(kernel_num, func); \
|
||||||
time_sw[kernel_num] += get_mseconds() - start_time
|
time_sw[kernel_num] += get_mseconds() - start_time
|
||||||
#else
|
#else
|
||||||
#define PERFORMANCE_TEST_NORMAL(kernel_num, func) _PERFORMANCE_TEST_NORMAL(kernel_num, func)
|
#define PERFORMANCE_TEST_NORMAL(kernel_num, func) _PERFORMANCE_TEST_NORMAL(kernel_num, func)
|
||||||
|
|
@ -98,7 +147,7 @@ int64_t time_sw[KERNEL_NUM] = {0};
|
||||||
int read_seq_line(char *read_buf, FILE *f_ptr, char *out_arr)
|
int read_seq_line(char *read_buf, FILE *f_ptr, char *out_arr)
|
||||||
{
|
{
|
||||||
if (fgets(read_buf, READ_BUF_SIZE, f_ptr) == NULL)
|
if (fgets(read_buf, READ_BUF_SIZE, f_ptr) == NULL)
|
||||||
return 0;
|
return -1;
|
||||||
int line_size = strlen(read_buf);
|
int line_size = strlen(read_buf);
|
||||||
assert(line_size < READ_BUF_SIZE);
|
assert(line_size < READ_BUF_SIZE);
|
||||||
if (read_buf[line_size - 1] == '\n')
|
if (read_buf[line_size - 1] == '\n')
|
||||||
|
|
@ -152,8 +201,8 @@ int main(int argc, char *argv[])
|
||||||
FILE *query_f = 0, *target_f = 0, *info_f = 0;
|
FILE *query_f = 0, *target_f = 0, *info_f = 0;
|
||||||
|
|
||||||
// 每次读取一定量的数据,然后执行,直到处理完所有数据
|
// 每次读取一定量的数据,然后执行,直到处理完所有数据
|
||||||
int total_line_num = 0; // 目前处理的总的数据行数
|
int64_t total_line_num = 0; // 目前处理的总的数据行数
|
||||||
int block_line_num = 0; // 当前循环包含的数据行数
|
int block_line_num = 0; // 当前循环包含的数据行数
|
||||||
int cur_query_pos, cur_target_pos;
|
int cur_query_pos, cur_target_pos;
|
||||||
int64_t start_time;
|
int64_t start_time;
|
||||||
char read_buf[READ_BUF_SIZE]; // 读文件缓存
|
char read_buf[READ_BUF_SIZE]; // 读文件缓存
|
||||||
|
|
@ -204,8 +253,14 @@ int main(int argc, char *argv[])
|
||||||
while (!feof(target_f) && cur_read_size < BLOCK_BUF_SIZE)
|
while (!feof(target_f) && cur_read_size < BLOCK_BUF_SIZE)
|
||||||
{
|
{
|
||||||
int line_size = read_seq_line(read_buf, target_f, target_arr + cur_read_size);
|
int line_size = read_seq_line(read_buf, target_f, target_arr + cur_read_size);
|
||||||
// fprintf(stderr, "line: %d\n", line_size);
|
// for (j = 0; j < line_size; ++j)
|
||||||
if (line_size == 0)
|
//{
|
||||||
|
// // fprintf(stderr, "%c", t_2bit2char[(uint8_t)read_buf[j]]);
|
||||||
|
// fprintf(stderr, "%c", t_2bit2char[(uint8_t)target_arr[j + cur_read_size]]);
|
||||||
|
// }
|
||||||
|
// fprintf(stderr, "\n");
|
||||||
|
// fprintf(retval_f_arr[1], "%d\n", line_size);
|
||||||
|
if (line_size == -1)
|
||||||
break;
|
break;
|
||||||
cur_read_size += line_size;
|
cur_read_size += line_size;
|
||||||
++block_line_num;
|
++block_line_num;
|
||||||
|
|
@ -217,7 +272,13 @@ int main(int argc, char *argv[])
|
||||||
for (i = 0; i < block_line_num; ++i)
|
for (i = 0; i < block_line_num; ++i)
|
||||||
{
|
{
|
||||||
int line_size = read_seq_line(read_buf, query_f, query_arr + cur_read_size);
|
int line_size = read_seq_line(read_buf, query_f, query_arr + cur_read_size);
|
||||||
if (line_size == 0)
|
// int j;
|
||||||
|
// for (j = cur_read_size; j < cur_read_size + line_size; ++j)
|
||||||
|
//{
|
||||||
|
// fprintf(retval_f_arr[0], "%c", t_2bit2char[(uint8_t)query_arr[j]]);
|
||||||
|
// }
|
||||||
|
// fprintf(retval_f_arr[0], "\n");
|
||||||
|
if (line_size == -1)
|
||||||
break;
|
break;
|
||||||
cur_read_size += line_size;
|
cur_read_size += line_size;
|
||||||
}
|
}
|
||||||
|
|
@ -236,26 +297,43 @@ int main(int argc, char *argv[])
|
||||||
// fprintf(stderr, "%s\n", read_buf);
|
// fprintf(stderr, "%s\n", read_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cur_read_size = 0;
|
||||||
|
for (i = 0; i < block_line_num; ++i)
|
||||||
|
{
|
||||||
|
for (j = cur_read_size; j < cur_read_size + info_arr[i][1]; ++j)
|
||||||
|
{
|
||||||
|
fprintf(retval_f_arr[0], "%c", t_2bit2char[(uint8_t)target_arr[j]]);
|
||||||
|
}
|
||||||
|
fprintf(retval_f_arr[0], "\n");
|
||||||
|
cur_read_size += info_arr[i][1];
|
||||||
|
}
|
||||||
|
// for (i = 0; i < block_line_num; ++i)
|
||||||
|
//{
|
||||||
|
// fprintf(retval_f_arr[0], "%d\n", info_arr[i][1]);
|
||||||
|
//}
|
||||||
|
|
||||||
// 性能测试
|
// 性能测试
|
||||||
|
|
||||||
// normal sw
|
// normal sw
|
||||||
PERFORMANCE_TEST_NORMAL(0, ksw_extend_normal);
|
// PERFORMANCE_TEST_NORMAL(0, ksw_extend_normal);
|
||||||
|
|
||||||
// avx2
|
// avx2
|
||||||
PERFORMANCE_TEST_AVX2(1, ksw_extend_avx2);
|
// PERFORMANCE_TEST_AVX2(1, ksw_extend_avx2);
|
||||||
// avx2 heuristics
|
// avx2 heuristics
|
||||||
PERFORMANCE_TEST_AVX2(2, ksw_extend_avx2_heuristics);
|
// PERFORMANCE_TEST_AVX2(2, ksw_extend_avx2_heuristics);
|
||||||
// avx2 mem aligned
|
// avx2 mem aligned
|
||||||
PERFORMANCE_TEST_AVX2(3, ksw_extend_avx2_aligned);
|
// PERFORMANCE_TEST_AVX2(3, ksw_extend_avx2_aligned);
|
||||||
|
|
||||||
// avx2 u8
|
// avx2 u8
|
||||||
PERFORMANCE_TEST_AVX2(4, ksw_extend_avx2_u8);
|
// PERFORMANCE_TEST_AVX2(4, ksw_extend_avx2_u8);
|
||||||
// avx2 u8 heuristics
|
// avx2 u8 heuristics
|
||||||
PERFORMANCE_TEST_AVX2(5, ksw_extend_avx2_u8_heuristics);
|
// PERFORMANCE_TEST_AVX2(5, ksw_extend_avx2_u8_heuristics);
|
||||||
// avx2 u8 mem aligned
|
// avx2 u8 mem aligned
|
||||||
PERFORMANCE_TEST_AVX2(6, ksw_extend_avx2_u8_aligned);
|
// PERFORMANCE_TEST_AVX2(6, ksw_extend_avx2_u8_aligned);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "%ld\n", total_line_num);
|
||||||
|
|
||||||
#ifdef SHOW_PERF
|
#ifdef SHOW_PERF
|
||||||
char *kernel_names[7] = {
|
char *kernel_names[7] = {
|
||||||
"normal",
|
"normal",
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
/home/zzh/work/sw_perf/sw_perf /home/zzh/work/sw_perf/input/q.fa /home/zzh/work/sw_perf/input/t.fa /home/zzh/work/sw_perf/input/i.txt
|
#/home/zzh/work/sw_perf/sw_perf /home/zzh/work/sw_perf/input/q.fa /home/zzh/work/sw_perf/input/t.fa /home/zzh/work/sw_perf/input/i.txt
|
||||||
|
/home/zzh/work/sw_perf/sw_perf /home/zzh/work/sw_perf/input/q_d.fa /home/zzh/work/sw_perf/input/t_d.fa /home/zzh/work/sw_perf/input/i_d.txt
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue