Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing OpenMP中的共享阵列 我试图将一段C++代码与OpenMP并行化,但我面临一些问题。 事实上,我的并行代码并不比串行代码快。 我想我已经明白了原因,但我无法解决它_Parallel Processing_Openmp - Fatal编程技术网

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
这应该不会有太大的变化,但某些实现会产生昂贵的并行区域创建

案例2:使用每个线程访问每个元素

我想说,如果您执行更新,您不能这样做,否则,您可能会有一致性问题,因为您在循环中有顺序依赖关系