Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串搜索-并行版本较慢_C++_Openmp - Fatal编程技术网

C++ 字符串搜索-并行版本较慢

C++ 字符串搜索-并行版本较慢,c++,openmp,C++,Openmp,我正在尝试将用于字符串搜索的朴素算法并行化。我创建了一个简单的版本,然后我尝试使用多个线程来加速它 但是下面的代码会让它慢得多: template<typename T> long unsigned int simple_paralel(const T * str1, unsigned long int str1_length, const T * str2, unsigned long int str2_length) { unsigned int long result =

我正在尝试将用于字符串搜索的朴素算法并行化。我创建了一个简单的版本,然后我尝试使用多个线程来加速它

但是下面的代码会让它慢得多:

template<typename T> long unsigned int simple_paralel(const T * str1, unsigned long int str1_length, const T * str2, unsigned long int str2_length) {
  unsigned int long result = ~0;
  unsigned int long count = 0;

  unsigned long int in;
  unsigned int long top;
  #pragma omp parallel
  #pragma for ordered shared(result, count) private(in, top) firstprivate(str1, str2, str1_length, str2_length)
  for (top = 0; top < str1_length; top++) {
    in = 0;

    // & top + in < str1_length
    while (in < str2_length ) {
      if ( top + in >= str1_length)
        break;

      if ( str1[top+in] != str2[in] ) {
        break;
      }
      ++in;

      if( in == str2_length ) {
        // shared and we want to have the smallest index
        if( result >= top + 1 ) {
          result = top + 1;
        }
        count++;
      }
    }
  }
  return count;
}
template long unsigned int simple_parallel(常量T*str1,unsigned long int str1_length,常量T*str2,unsigned long int str2_length){
无符号整型长结果=~0;
无符号整数长计数=0;
无符号长整型输入;
无符号整数长顶;
#pragma-omp并行
#有序共享(结果,计数)private(in,top)firstprivate(str1,str2,str1_长度,str2_长度)的pragma
用于(top=0;top=str1\u长度)
打破
如果(str1[top+in]!=str2[in]){
打破
}
++在;
if(in==str2_长度){
//共享,我们希望有最小的索引
如果(结果>=顶部+1){
结果=顶部+1;
}
计数++;
}
}
}
返回计数;
}

我做错了什么?

所以我退后一步,尝试了一种不同的方法:

template<typename T> long unsigned int simple_paralel(const T * str1, unsigned long int str1_length, const T * str2, unsigned long int str2_length, int threads) {
  count = 0;

  unsigned long int block = str1_length/threads;
  unsigned long int total = 0;
  unsigned long int result = 0;

  unsigned long int smallest = ~0;
  #pragma omp parallel for shared(count)
  for(int i=0; i<threads; i++)
  {
    unsigned long int res;
    unsigned long int start = i * block;
    if(i != threads -1 )
    {
      total += block;
      res = simple_p(str1 + start, block, str2, str2_length, false);
    } else {
      res = simple_p(str1 + start, str1_length - total, str2, str2_length);
    }

    if(res < result && res != 0 ){
      result = res;
    }
  }

  return count;
}
template long unsigned int simple_parallel(常量T*str1,unsigned long int str1_length,常量T*str2,unsigned long int str2_length,int threads){
计数=0;
无符号长整型块=str1_长度/线程;
无符号长整型合计=0;
无符号长整型结果=0;
无符号长整型最小值=~0;
#用于共享的pragma omp并行(计数)

for(int i=0;iRandom guess:每个线程中没有足够的工作来补偿启动/停止/整理结果的开销?可能很多,而周期将立即结束,因为没有找到匹配项。如何解决这个问题?我很难说,因为我不知道您试图解决的特定问题的确切细节(我了解基本知识,但有很多细节,比如字符串有多大,有多少个,字符串的前半部分有多少匹配,它们是否排序,它们是否可以排序,等等-我肯定我没有想到这里所有重要的事情)。通常,每个线程与其他线程分开运行的时间越长,并行运行的性能就越好。您确实意识到您的第二个
#pragma
是错误的,对吗?您缺少了
omp
,这使它成为编译器忽略的一条简单注释。我不知道您的代码应该做什么,但它是用于什么的最重要的是,如果指令中没有这个
omp
,它在使用OpenMP编译时不会变得更快。但我仍然不相信,我不能用OpenMP做到这一点。我对这句话感到困惑。看起来你在这里使用OpenMP。这是解决问题的答案吗?我的错!我的意思是:我想,OpenMP可以像我的解决方案一样,轻松地将输入分割成块。