2

我正在 CUDA 中实现并行 Smith Waterman 算法,但现在遇到了一些麻烦。分数矩阵的最后两行根本没有被计算,它们只是显示为零。矩阵的其余部分计算正确。

该算法分两个阶段运行。首先线程数增加到 seq 长度的大小,然后收缩回 0。内核以不同的线程数和 k 值重复调用。c 是我的得分矩阵,a,b 是序列,k 是第 k 个反对角线 (i+j=k)。与 Smith Waterman 算法一样,这些值偏移 1。

这是我的内核:

__global__ void SmithWKernelExpand(int (*c)[arraySize+1], const char *a, const char *b, int *k)
{
    int i = threadIdx.x+1;
    int j = ((*k)-i)+1;
    int north=c[i][(j)-1]-1;            //Indel
    int west=c[i-1][j]-1;
    int northwest;
    if (((int) a[i-1])==((int)b[(j)-1]))
        northwest=c[i-1][(j)-1]+2;      //Match
    else
        northwest=c[i-1][(j)-1]-1;      //Mismatch
    //c[i][j] = max(max(north, west),max(northwest,0));
    c[i][j]=(*k);  //Print the number of anti diagonal - For Debugging
}

__global__ void SmithWKernelShrink(int (*c)[arraySize+1], const char *a, const char *b, int *k)
{
    int i = threadIdx.x+((*k)-arraySize)+1;
    int j = ((*k)-i)+1;
    int north=c[i][(j)-1]-1;            //Indel
    int west=c[i-1][j]-1;
    int northwest;
    if (((int) a[i-1])==((int)b[(j)-1]))
        northwest=c[i-1][(j)-1]+2;      //Match
    else
        northwest=c[i-1][(j)-1]-1;      //Mismatch
    //c[i][j] = max(max(north, west),max(northwest,0));
    c[i][j]=(*k);  //Print the number of anti diagonal - For Debugging
}

输出是:

0       0       0       0       0       0       0       0       0
0       1       2       3       4       5       6       7       8
0       2       3       4       5       6       7       8       9
0       3       4       5       6       7       8       9       10
0       4       5       6       7       8       9       10      11
0       5       6       7       8       9       10      11      12
0       6       7       8       9       10      11      12      13
0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0

有人可以帮我解决这个问题吗?

4

0 回答 0