我的程序是这样的:
int *array;
#pragma omp threadprivate(array1)
int main()
{
array = new int[N];//N is already known.
func_A();
...
}
void func_B()
{
func_C();
......
}
void func_C()
{
do something to array(write to array);
}
void func_A()
{
#pragma omp parallel copyin(array)
#pragma omp parallel for
for(i = 0 ; i < n ; i ++)
func_B();
}
当我调试(VS 2012)程序并观察(它是否清楚?)时,编译器总是说没有这样的变量。谁能告诉我错误在哪里以及如何解决它?
我有一个相邻矩阵演示的大图。我想找出图中有多少具有特定形状的子图。因为它需要很长时间,所以我想使用OpenMP,我想给每个线程都有一个这个图的副本。我做了这个,因为我的代码显示,但是有很多记忆问题。这就是我想要做的。
答案 0 :(得分:1)
您的代码将创建指向数组的指针的私有副本而不是数组。这将是有用的唯一原因是,如果您希望每个线程的不同指针跨越并行区域到同一个数组。我怀疑你真的想要做别的事情。如果您确实希望在并行区域中拥有动态数组的不同私有副本,则需要在并行区域中明确分配它们并按如下方式复制值。
#include <stdio.h>
#include <omp.h>
#include <string.h>
int *array, *array_private;
#pragma omp threadprivate(array_private)
#define N 100
int main() {
array = new int[N];
#pragma omp parallel
{
array_private = new int[N];
memcpy(array_private, array, sizeof(int)*N); //or use std::copy
}
#pragma omp parallel
{
delete[] array_private;
}
delete[] array;
}
请注意,C / C ++中的OpenMP以不同方式处理动态数组和静态数组。动态数组被视为指针,静态数组被视为数组。因此,静态数组上的copyin
实际上会复制数组的所有元素而不是指针值。