我用C ++编写了一个OpenMP程序,它基本上找到了给定长度的后缀 - 前缀重叠。我的所有字符串都存储在一个向量中,我有两个for循环用于检查重叠(全部对着所有)。我试图使for循环并行,但它不会改善时间。以下是我的计划
vector<string> Reads; // contains all strings
vector<int> *AdjList = new vector<int>[Reads.size()];
vector<int> *OLL = new vector<int>[Reads.size()];
// int i,j;
/*# pragma omp parallel \
shared ( AdjList, OLL ) \
private ( i, j )*/
#pragma omp parallel for
for(int i=0; i<Reads.size(); i++){
string suff = Reads.at(i).substr(Reads.at(i).length() - minOLL, minOLL);
for(int j=0; j<Reads.size(); j++){
if(i != j){
size_t found = rabin_karp(suff, Reads.at(j));
if(found != -1){
string pref1 = Reads.at(j).substr(0, found);
string suff1 = Reads.at(i).substr(Reads.at(i).length() - minOLL - found, found);
if(pref1.compare(suff1) == 0){
AdjList[i].push_back(j);
OLL[i].push_back(found + minOLL);
}
}
}
}
}
我猜reduction
可能有所帮助,但我对如何使用它一无所知
答案 0 :(得分:2)
1.由于字符串的大小可能不同,您可以使用schedule(动态),以便将任务动态分配给线程。 2.你可以将内部循环拆分成两个循环来摆脱if语句。 3. substr不是一个好的选择因为导致创建新的字符串,所以你可以使用并保存字符位置来加速代码。但是下面应用了1,2个提到的案例:
#pragma omp parallel for schedule(dynamic)
for(int i=0; i<Reads.size(); i++){
string suff = Reads.at(i).substr(Reads.at(i).length() - minOLL, minOLL);
for(int j=0; j< i; j++){
size_t found = rabin_karp(suff, Reads.at(j));
if(found != -1){
string pref1 = Reads.at(j).substr(0, found);
string suff1 = Reads.at(i).substr(Reads.at(i).length() - minOLL - found, found);
if(pref1.compare(suff1) == 0){
AdjList[i].push_back(j);
OLL[i].push_back(found + minOLL);
}
}
}
for(int j=i+1; j< Reads.size(); j++){
size_t found = rabin_karp(suff, Reads.at(j));
if(found != -1){
string pref1 = Reads.at(j).substr(0, found);
string suff1 = Reads.at(i).substr(Reads.at(i).length() - minOLL - found, found);
if(pref1.compare(suff1) == 0){
AdjList[i].push_back(j);
OLL[i].push_back(found + minOLL);
}
}
}
}
答案 1 :(得分:0)
这是一个例子。
#include "pch.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <omp.h>
using namespace std;
class Monitorius {
private:
int M[50];
int count = 0;
int suma = 0;
public:
Monitorius()
{
for (int i = 0; i < 50; i++)
M[i] = 0; // nusinulinamas masyvas
}
// Funkcijos ---------------------------------------
void Prideti(int skaicius)
{
#pragma omp critical
{
M[count] = skaicius;
count++;
Suma();
}
}
void Suma()
{
suma = 0;
for (int i = 0; i < 50; i++) {
suma += M[i];
}
cout << "Suma: " << suma << endl;
}
};
void paleistiGijas(Monitorius *monitorius) {
#pragma omp parallel num_threads(5)
{
for (int i = 1; i <= 10; i++) {
monitorius->Prideti(i);
}
}
}
int main()
{
// Monitoriaus sukurimas bei giju paleidimas
Monitorius *monitorius = new Monitorius();
// Pradedamas giju darbas
paleistiGijas(monitorius);
// Atlaisvinama atmintis
delete(monitorius);
return 0;
}