【问题标题】:OpenMP stackvariablesOpenMP 堆栈变量
【发布时间】:2019-06-15 21:48:30
【问题描述】:

我目前正在学习 OpenMP。在并行区域之外声明的默认变量是公共的,而在并行区域内声明的变量是私有的。并行区域内部的堆栈变量也是私有的。

double A[10];
int index[10];
#pragma omp parallel
{
 work(index);
}
printf(%d\n”,index[0]);

但为什么上述示例中的“索引”对每个线程都是公开的?它不应该是私有的,因为它放在堆栈上,堆栈变量是私有的吗?

提前致谢

【问题讨论】:

  • 为什么你会认为“堆栈变量是私有的”?如果您写“公共”,您的意思是“共享”吗?您是否也有与this question 中讨论的相同的误解?
  • 嗯,我正在为考试而学习,幻灯片上有一行“但并非所有内容都是共享的 - 从并行区域调用的 C 函数中的堆栈变量是私有的”。抱歉,是的,当我说公开时,我的意思是共享

标签: openmp


【解决方案1】:

声明

堆栈变量在 C 函数中并行区域调用是 private

是真的,但你需要区分你的情况。首先,

int index[10];
#pragma omp parallel
{
    // index is a shared variable here
    work(index);
}

但是当涉及到你调用的函数时,想象一下:

void work(int* passed_index)
{
    ...
}

passed_index - 指针 - 实际上是 work 中的 private 变量。您可以更改指针,其他线程不会注意到。

但是*passed_index指向的数据还是共享的。

【讨论】:

  • 啊,我明白了。所以我可以改变passed_index的指针,但是当我尝试时,可以说做passed_index[0] = 1;这会对其他线程产生影响,对吗?另外,当我在 work() 中定义一个变量时,我猜它会变成私有的
  • 您仍然可以安全地处理数组的不同 元素(例如,passed_index[i] 上的线程 i)。是的,work 中定义的变量是私有的,但当然不能只使用int* foo = passed_index - 那仍然是指向共享数据的指针。
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 2011-04-13
  • 2014-12-09
  • 1970-01-01
  • 2013-09-27
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多