omp在ubuntu c ++中使用

我试图用omp编写代码; 它有一个这样的部分(Brandes的Betweeness Centrality算法):

int main(int argc, char* argv[]){
{//file reading section
 (...)
}
A = new vector<int>[V];
    int conteudo;
    for(i=0;i<E;i++){
        conteudo = grafo[i][0];

        A[conteudo].push_back(grafo[i][1]); 
        A[grafo[i][1]].push_back(conteudo); 
    }

    float *Cb = new float[V];
    // CÓDIGO DE BRANDES 
    #pragma omp parallel default(none) shared(i,A,j,V) private(Cb) 
        {
    float *Cb = new float[V];
    float *sigma = new float[V];
    int *d = new int[V];
    int v, w;
    for (i = 0; i<V; i++) {
        Cb[i] = 0;
    }


        #pragma omp parallel for 
        for (int s = 0; s<V; s++) {

            for (i = 0; i<V; i++) {
                sigma[i] = 0;
                d[i] = -1; 
            }

            vector<int> *P;
            vector<int> S;
            vector<int> Q;
            P = new vector<int>[V];

            sigma[s] = 1;
            d[s] = 0;

            Q.push_back(s);

            while(!Q.empty()){

                v = Q[0];
                Q.erase(Q.begin());
                S.push_back(v);

                for(j=0;j<A[v].size();j++){

                    w = A[v][j];
                    if (d[w]<0) {
                        Q.push_back(w);
                        d[w] = d[v]+1;
                    }

                    if (d[w] == (d[v] + 1)) {
                        sigma[w] = sigma[w] + sigma[v];
                        P[w].push_back(v);
                    }

                }
            }

            float *delta = new float[V];
            for (i = 0; i<V; i++) {
                delta[i] = 0;
            }

            while(!S.empty()) {
                w = S[S.size()-1];
                S.pop_back();

                for (i = 0; i<P[w].size(); i++){
                    v = P[w][i]; 
                        delta[v] = delta[v] + (sigma[v] / sigma[w])*(1 + delta[w]);         
                }
                if(w != s) {    
                    Cb[w] = (Cb[w] + delta[w]);
                }
            }
        }

    }
...

}

顺序代码运行良好; 然而,我想并行上面的for循环; 但是,在最后一行

if(w != s) {    
        Cb[w] = (Cb[w] + delta[w]);
}

Cb数组必须对每个进程都是私有的,并且毕竟我想对所有Cb进行减法求和。 但是当我宣布时

#pragma omp parallel for private(Cb)

并编译

$ g++ BC_omp.cpp -fopenmp
$ ./a.out file.txt

我收到错误:

segmentation fault (core dumped) 

我想我不明白omp是如何工作的: - 在pragma之前声明的变量是共享的吗? - 私有声明的变量对进程是本地的; 但在这种情况下,如何减少数组? (最后,我必须将整个过程中的所有Cb都减少到一个单独的过程,并将其总和作为值。)

链接地址: http://www.djcxy.com/p/79219.html

上一篇: omp use in ubuntu c++

下一篇: OpenMP slow private function