CUDA中的并行Smith-Waterman算法实现-未计算最后2行

CUDA中的并行Smith-Waterman算法实现-未计算最后2行,cuda,bioinformatics,Cuda,Bioinformatics,我正在CUDA中进行并行Smith-Waterman算法的实现,但现在遇到了一些麻烦。分数矩阵的最后两行根本不计算,它们只显示零。矩阵的其余部分计算正确 算法分两个阶段运行。首先,线程数增加到seq长度的大小,然后收缩回0。使用不同的线程数和k值重复调用内核。c是我的分数矩阵,a,b是序列,k是第k个反对角(i+j=k)。这些值在史密斯-沃特曼算法中偏移1 这是我的内核: __global__ void SmithWKernelExpand(int (*c)[arraySize+1], cons

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

算法分两个阶段运行。首先,线程数增加到seq长度的大小,然后收缩回0。使用不同的线程数和k值重复调用内核。c是我的分数矩阵,a,b是序列,k是第k个反对角(i+j=k)。这些值在史密斯-沃特曼算法中偏移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

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

很明显,输出数组的c[i][j]元素是由一个特定的线程ID设置的。因为最后两行没有设置,所以这是i范围的函数,即threadIdx.x+1,并且该值就是您在*k中传递的任何值。因此,对我来说,仅仅发布内核代码似乎是不够的。我们还需要查看您的内核调用。假设您没有在*k中传递0,一种可能是您没有为每个块创建足够的线程。也可能是数据复制的问题,您也没有显示。如果没有完整的复制案例,此问题无法回答,并且尚未提供。投票结束。