Parallel processing OpenMP中的共享阵列 我试图将一段C++代码与OpenMP并行化,但我面临一些问题。 事实上,我的并行代码并不比串行代码快。 我想我已经明白了原因,但我无法解决它
我的代码结构如下所示:Parallel processing OpenMP中的共享阵列 我试图将一段C++代码与OpenMP并行化,但我面临一些问题。 事实上,我的并行代码并不比串行代码快。 我想我已经明白了原因,但我无法解决它,parallel-processing,openmp,Parallel Processing,Openmp,我的代码结构如下所示: int vec1 [M]; int vec2 [N]; ...initialization of vec1 and vec2... for (int it=0; it < tot_iterations; it++) { if ( (it+1)%2 != 0 ) { #pragma omp parallel for for (int j=0 ; j < N ; j++) { ....code involving a call to a
int vec1 [M];
int vec2 [N];
...initialization of vec1 and vec2...
for (int it=0; it < tot_iterations; it++) {
if ( (it+1)%2 != 0 ) {
#pragma omp parallel for
for (int j=0 ; j < N ; j++) {
....code involving a call to a function to which I'm passing as a parameter vec1.....
if (something) { vec2[j]=vec2[j]-1;}
}
}
else {
# pragma omp parallel for
for (int i=0 ; i < M ; i++) {
....code involving a call to a function to which I'm passing as a parameter vec2.....
if (something) { vec1[i]=vec1[i]-1;}
}
}
}
intvec1[M];
int-vec2[N];
…vec1和vec2的初始化。。。
for(int it=0;it
我认为我的并行化代码可能比较慢,因为多个线程想要访问同一个共享阵列,而一个线程必须等到另一个线程完成,但我不确定事情到底是如何进行的。但是我不能让vec1和vec2私有,因为在其他迭代中看不到更新。。。
如何改进???当您谈到使用多线程访问同一阵列时的问题时,这称为“错误共享”。除非您的数组很小,否则它不应该是这里的瓶颈,因为
pragma omp parallel for
在默认实现中使用静态调度(至少使用gcc),因此每个线程都应该访问大部分数组,而无需一致性,除非您的“…代码涉及调用我作为参数vec2传递到的函数…”确实可以访问数组中的很多元素
案例1:在这部分代码中,您不能访问数组中的大多数元素
- M是否足够大以使并行性变得有用
- 你能移动外环上的平行度吗?(一个循环仅用于vec1,另一个循环仅用于vec2)
- 尝试移动并行区域代码:
int vec1 [M]; int vec2 [N]; ...initialization of vec1 and vec2... #pragma omp parallel for (int it=0; it < tot_iterations; it++) { if ( (it+1)%2 != 0 ) { #pragma omp for for (int j=0 ; j < N ; j++) { ....code involving a call to a function to which I'm passing as a parameter vec1..... if (something) { vec2[j]=vec2[j]-1;} } } else { # pragma omp for for (int i=0 ; i < M ; i++) { ....code involving a call to a function to which I'm passing as a parameter vec2..... if (something) { vec1[i]=vec1[i]-1;} } }
intvec1[M]; int-vec2[N]; …vec1和vec2的初始化。。。 #pragma-omp并行 for(int it=0;it