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