2014-04-01 79 views
1

这是家庭作业,但由于标签被弃用我我指出这一点在这里...字符串匹配GPU CUDA错误

我使用CUDA,做了模式的strightforward匹配处理作业在一个字符串中。该文本文件包含1,000,000个字符(所有相同字符,但最后一个不同)和一个大小为100的模式(再次是所有相同的字符,最后一个字符不同),所以该模式应该位于文本。

我试图让它与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循环边界而有所作为。

任何帮助/建议/指针将不胜感激。

谢谢

+0

我不认为cuda错误30将是正常的seg故障。如果你用'cuda-memcheck'运行你的代码,你能发现失败案例中的任何东西('dev_pattData [j]')吗? –

+0

有没有一个简单的方法来从VS程序做到这一点?我可以从发布的exe文件中生成吗? – user1089599

+1

是的,你可以在Windows机器上做到这一点。你确实需要使用生成的可执行文件(而不是在VS中运行你的代码)。你可能不得不四处寻找'cuda-memcheck.exe'的安装位置,但Windows搜索应该能够为你找到它。 –

回答

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"); 
} 

并猜测什么......该代码的作品!所以这个问题与核心算法无关,而是在你的代码中的其他地方。