如何在使用openMP时初始化threadprivate动态数组?

时间:2014-07-24 01:52:18

标签: c++ visual-studio concurrency openmp

我的程序是这样的:

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,我想给每个线程都有一个这个图的副本。我做了这个,因为我的代码显示,但是有很多记忆问题。这就是我想要做的。

1 个答案:

答案 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实际上会复制数组的所有元素而不是指针值。