字符串搜索 - 并行版本较慢
String searching - parallel version is slower
我正在尝试将朴素算法用于字符串搜索。我创建了简单的版本,然后尝试使用多个线程加快速度。
但是下面的代码会让它慢得多:
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<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;
}
它按预期工作。但我仍然不敢相信,我不能用OpenMP做到这一点。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- C++17中的并行执行策略
- 在clang++预处理器中确定gcc工具链版本
- 并行用于C++17中数组索引范围内的循环
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 如何在Elixir中调用递归函数并行
- OpenMP:并行更新数组总是需要减少数组吗
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字符串搜索 - 并行版本较慢
- 为什么并行版本的累加会慢得多
- 如何以最少的重复管理并行和顺序版本代码
- 顺序和并行版本给出不同的结果 - 为什么
- 如何同时使用并行和串行版本的MKL
- 将Xcode 3和Xcode 4工具链转化为可并行使用的版本包
- 在执行并行版本时,双重免费或损坏(fasttop)
- OpenMP 并行版本的运行速度比串行版本慢