带有Vectors的OpenMP C ++程序

时间:2016-07-21 03:01:49

标签: c++ openmp

我用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可能有所帮助,但我对如何使用它一无所知

2 个答案:

答案 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;
}