错误的结果私有阵列openmp

时间:2013-11-25 16:44:06

标签: c arrays parallel-processing openmp

我正在尝试使用在我的双核机器上运行的openmp在C中编写代码,并从数组中读取int值并将结果放在另一个数组中,但结果却是错误的。这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <omp.h>

int array[10];
int array2[10];
int np,iam;

int main() {
  array[0]=12; // 0
  array[1]=21; // 21
  array[2]=13; // 26
  array[3]=31; // 93
  array[4]=40; // 160
  array[5]=32; // 160
  array[6]=16; // 96
  array[7]=51; // 357
  array[8]=7;  // 56
  array[9]=23; // 207

  int i;
  #pragma omp parallel for private(i,array)
  for(i=0;i<10;i++){
    #if defined (_OPENMP)
      np = omp_get_num_threads();
      iam = omp_get_thread_num();
    #endif
    printf("iam %d and i am doing % d\n",iam,i);
    array2[i] = array[i]*i;
  }

  for(i=0;i<10;i++){
    printf("%d ",array2[i]);
  }
  printf("\n");
  return EXIT_SUCCESS;
}

非并行版本的结果是:

iam 0 and i am doing  0
iam 0 and i am doing  1
iam 0 and i am doing  2
iam 0 and i am doing  3
iam 0 and i am doing  4
iam 0 and i am doing  5
iam 0 and i am doing  6
iam 0 and i am doing  7
iam 0 and i am doing  8
iam 0 and i am doing  9
0 21 26 93 160 160 96 357 56 207

并行版本的结果是:

iam 0 and i am doing  0
iam 0 and i am doing  1
iam 0 and i am doing  2
iam 0 and i am doing  3
iam 0 and i am doing  4
iam 1 and i am doing  5
iam 1 and i am doing  6
iam 1 and i am doing  7
iam 1 and i am doing  8
iam 1 and i am doing  9
0 -1217558997 1859518440 6 0 -1792801609 1284743096 -364 -1166026656 0 

编辑1:我需要将数组“数组”设为私有。它在这种情况下没有任何意义,但我试图将一个数组作为私有使用它以后在我正在处理的另一个案例中。

1 个答案:

答案 0 :(得分:1)

我找到了使用的解决方案:

#pragma omp parallel for private(i) firstprivate(array)

firstprivate导致将值从外部上下文引入并行区域。使用private子句不会带来外部上下文中的值,它只是声明一个私有而不是初始化的变量,因此该变量具有随机值。