我不认为你这样做 - 我所做的解决这个问题的方法是使用并行区域#pragma omp parallel shared(...) private(...)
并在并行区域内动态分配数组。试试这个:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/* compile with gcc -o test2 -fopenmp test2.c */
int main(int argc, char** argv)
{
int i = 0;
int size = 20;
int* a = (int*) calloc(size, sizeof(int));
int* b = (int*) calloc(size, sizeof(int));
int* c;
for (i = 0; i < size; i++)
{
a[i] = i;
b[i] = size-i;
printf("[BEFORE] At %d: a=%d, b=%d\n", i, a[i], b[i]);
}
#pragma omp parallel shared(a,b) private(c,i)
{
c = (int*) calloc(3, sizeof(int));
#pragma omp for
for (i = 0; i < size; i++)
{
c[0] = 5*a[i];
c[1] = 2*b[i];
c[2] = -2*i;
a[i] = c[0]+c[1]+c[2];
c[0] = 4*a[i];
c[1] = -1*b[i];
c[2] = i;
b[i] = c[0]+c[1]+c[2];
}
free(c);
}
for (i = 0; i < size; i++)
{
printf("[AFTER] At %d: a=%d, b=%d\n", i, a[i], b[i]);
}
}
这对我产生了相同的结果,我刚才的实验计划:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/* compile with gcc -o test1 -fopenmp test1.c */
int main(int argc, char** argv)
{
int i = 0;
int size = 20;
int* a = (int*) calloc(size, sizeof(int));
int* b = (int*) calloc(size, sizeof(int));
for (i = 0; i < size; i++)
{
a[i] = i;
b[i] = size-i;
printf("[BEFORE] At %d: a=%d, b=%d\n", i, a[i], b[i]);
}
#pragma omp parallel for shared(a,b) private(i)
for (i = 0; i < size; i++)
{
a[i] = 5*a[i]+2*b[i]-2*i;
b[i] = 4*a[i]-b[i]+i;
}
for (i = 0; i < size; i++)
{
printf("[AFTER] At %d: a=%d, b=%d\n", i, a[i], b[i]);
}
}
在猜测我会说,因为OpenMP的不能推导出数组的大小它可以不是私有的 - 只有编译时数组可以这样完成。当我试图私有一个动态分配的数组时,我得到了segfaults,可能是因为访问冲突。在每个线程上分配数组就好像您使用pthreads编写这个数组是合理的并解决了这个问题。
谢谢,分开openmp声明和parallel声明似乎完美地工作。 – cboettig 2010-03-01 01:13:12
@Ninefingers:我知道这个帖子很旧,但我有一个快速的问题。你甚至需要'#pragma omp for'语句吗?不管它是否并行执行该循环? – Amit 2012-06-08 18:39:38
@Amit nope,你需要告诉编译器突破线程,否则它不会。 – 2012-06-09 16:23:40