字符串匹配GPU CUDA错误

时间:2014-04-01 22:42:38

标签: c++ c cuda gpu

这是作业,但由于标签已被弃用,我在此指出...

我正在使用cuda进行一项任务,该任务对字符串中的模式进行了明确的匹配。文本文件包含1,000,000个字符(所有相同的字符,但最后一个是不同的)和大小为100的模式(同样是所有相同的字符,最后一个不同),因此模式应该在999,000的位置找到文本。

我试图让这个与10个线程一起工作,所以我相应地设置了算法的起点。

blocksize设置为10,000,startPoint变量是线程ID(0-9)。

int i,j,k,lastI;

    i=startPoint*blockSize;
    j=0;
    k=startPoint*blockSize; //may be -1...

    int end;
    end = ((startPoint+1) * blockSize) - patternLength; //may be -1

    //*testchar = dev_textData[((startPoint+1) * blockSize) -1];
    *testchar = dev_pattData[patternLength-1];
    *testchar = dev_textData[textLength-1];

    //*testchar = dev_textData[i+blockSize-1];
    //*result = end;
    //return;
    while (i<=end && j<patternLength)
    {
        if (dev_textData[k] == dev_pattData[j]) //going out of bounds at the j i think...
        {
            k++;
            j++;

        }
        else
        {
            i++;
            k=i;
            j=0;

        }
    }

    if (j == patternLength)
    {
        *result = i;
        *testchar = 'f';
    }
    else
    {
        *result = -1;

首先这里的程序似乎有错误,cuda错误30,未知错误(我认为这可能是一个段错误?),但是当我改变时

            if (dev_textData[k] == dev_pattData[j])

            if (dev_textData[k] == dev_pattData[j-1])

错误消失,但因为我在最后一个字符上匹配算法无法正常工作。

我似乎无法弄清楚为什么j-1因为while循环边界而有所不同。

非常感谢任何帮助/建议/指示。

谢谢

1 个答案:

答案 0 :(得分:1)

首先,让我们做数学运算。如果您有1,000,000个字符且模式长度为100,那么该模式应该是999,900。如果在10个线程之间拆分工作,那么每个线程应该被赋予100,000个字节。我给你带来困难的原因是我不得不怀疑模式长度是否与模式完全匹配。换句话说,模式实际上有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" );
}

然后猜猜......代码有效!!!所以问题与核心算法无关,而是在你的代码中的其他地方。