gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:46:20 30 4
gpt4 key购买 nike

我的程序是这样的:

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,我想给每个线程都有该图的拷贝。正如我的代码所示,我这样做了,但是出现了很多内存问题。这就是我想要做的。

最佳答案

您的代码将创建指向数组而不是数组的指针的私有(private)拷贝。这很有用的唯一原因是,如果您希望每个线程有不同的指针指向跨并行区域的同一个数组。我怀疑您真的在尝试做其他事情。如果您真的想要跨并行区域拥有动态数组的不同私有(private)拷贝,那么您需要在并行区域中显式分配它们并按如下方式复制值。

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

关于c++ - 如何在使用 openMP 时初始化 threadprivate 动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24923884/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com