C++ 字符串匹配GPU CUDA错误

C++ 字符串匹配GPU CUDA错误,c++,c,cuda,gpu,C++,C,Cuda,Gpu,这是家庭作业,但由于标签已被弃用,我在这里指出这一点 我正在使用cuda完成一项作业,该作业对字符串中的模式进行了快速前向匹配。文本文件包含1000000个字符(都是相同的字符,但最后一个不同)和大小为100的模式(同样是相同的字符,最后一个不同),因此该模式应该位于文本的999000位置 我试图让它与10个线程一起工作,因此我相应地设置了算法的起点 blocksize设置为10000,startPoint变量是线程id(0-9) 到 但是,错误消失了,因为我在匹配最后一个字符,所以算法不能正常

这是家庭作业,但由于标签已被弃用,我在这里指出这一点

我正在使用cuda完成一项作业,该作业对字符串中的模式进行了快速前向匹配。文本文件包含1000000个字符(都是相同的字符,但最后一个不同)和大小为100的模式(同样是相同的字符,最后一个不同),因此该模式应该位于文本的999000位置

我试图让它与10个线程一起工作,因此我相应地设置了算法的起点

blocksize设置为10000,startPoint变量是线程id(0-9)

但是,错误消失了,因为我在匹配最后一个字符,所以算法不能正常工作

我似乎不明白为什么j-1会因为while循环边界而产生不同

如有任何帮助/建议/建议,将不胜感激


谢谢

首先,让我们做数学题。如果您有1000000个字符,并且模式长度为100,那么应该在999900处找到模式。如果在10个线程之间分割工作,那么每个线程应该有100000字节。我给你们带来困难的原因是我想知道图案的长度是否与图案匹配。换句话说,这个模式实际上是有100个字节,还是只有99个字节

调试此类问题的一种方法是

  • 以您的原始代码为例
  • 将它放在一个有一个小数据集的测试环境中
  • 去掉所有让人分心的废话
  • 添加一些用于调试的printf
下面是执行此操作后代码的外观

int i,j,k,end;     
char textData[10] = "aaaaaaaaab";
char pattData[5]  = "aaaab";
int blockSize = 10;
int patternLength = 5;
int startPoint = 0;

i=startPoint*blockSize;
j=0;
k=startPoint*blockSize; 

end = ((startPoint+1) * blockSize) - patternLength; 

while (i<=end && j<patternLength)
{
    printf( "i=%d j=%d k=%d -- ", i, j, k );

    if (textData[k] == pattData[j]) 
    {
        k++;
        j++;
        printf( "match newi=%d newj=%d newk=%d\n", i, j, k );
    }
    else
    {
        i++;
        k=i;
        j=0;
        printf( "fail  newi=%d newj=%d newk=%d\n", i, j, k );
    }
}
printf( "end-of-loop i=%d j=%d k=%d\n", i, j, k );

if (j == patternLength)
{
    printf( "pattern found at %d\n", i );
}
else
{
    printf( "not found\n" );
}
inti,j,k,end;
char textData[10]=“aaaaaab”;
字符数据[5]=“aaaab”;
int blockSize=10;
int模式长度=5;
int起始点=0;
i=起始点*块大小;
j=0;
k=起始点*块大小;
结束=((起始点+1)*块大小)-图案长度;

虽然(我认为cuda错误30不会是正常的seg故障。在失败的情况下,您是否能够发现任何东西(
dev_pattData[j]
)如果您使用
cuda memcheck
运行代码?有没有一种简单的方法可以从VS程序执行此操作?我可以从生成的版本exe执行此操作吗?是的,您可以在windows计算机上执行此操作。您确实需要使用生成的可执行文件(而不是从VS中运行代码)。您可能需要四处搜寻以确定安装了
cuda memcheck.exe
的位置,但windows search应该可以为您找到它。
            if (dev_textData[k] == dev_pattData[j])
            if (dev_textData[k] == dev_pattData[j-1])
int i,j,k,end;     
char textData[10] = "aaaaaaaaab";
char pattData[5]  = "aaaab";
int blockSize = 10;
int patternLength = 5;
int startPoint = 0;

i=startPoint*blockSize;
j=0;
k=startPoint*blockSize; 

end = ((startPoint+1) * blockSize) - patternLength; 

while (i<=end && j<patternLength)
{
    printf( "i=%d j=%d k=%d -- ", i, j, k );

    if (textData[k] == pattData[j]) 
    {
        k++;
        j++;
        printf( "match newi=%d newj=%d newk=%d\n", i, j, k );
    }
    else
    {
        i++;
        k=i;
        j=0;
        printf( "fail  newi=%d newj=%d newk=%d\n", i, j, k );
    }
}
printf( "end-of-loop i=%d j=%d k=%d\n", i, j, k );

if (j == patternLength)
{
    printf( "pattern found at %d\n", i );
}
else
{
    printf( "not found\n" );
}