2013-11-25 85 views
0

我想在C编写代码使用openmp运行在我的双核心机器上,并从数组中读取int值,并将结果放入另一个数组,但我得到错误的结果。这是我的代码:错误的结果私人阵列openmp

#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

我发现是使用溶液:

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

FIRSTPRIVATE结果带来值从外部上下文到并行区域。使用private子句不会从外部上下文中获取值,它只是声明一个私有变量而不是初始化变量,所以变量具有一个随机值。