我正在試圖平行化字符串搜索的樸素算法。我創建了簡單的版本,然後嘗試使用多個線程來加速它。字符串搜索 - 並行版本比較慢
但下面的代碼使得它更慢:
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;
}
我在做什麼錯?
隨機猜測:每個線程中沒有足夠的工作來彌補開始/停止/整理結果的開銷? –
可能 - 許多週期將立即結束,因爲找不到匹配。如何解決這個問題? – tomascapek
我很難說,因爲我不知道你想要解決的具體問題的具體細節(我瞭解基本知識,但是有很多細節,比如有多大的弦,有多少是,字符串的第一部分在保存之前有多少匹配,它們是否被排序,它們是否可以被排序等等 - 我確信我沒有想到所有重要的東西)。一般來說,每個線程與其他線程分開運行時間越長,並行運行性能越好。 –