gpt4 book ai didi

c - 在 OpenMP 中,线程如何使用具有全局范围的变量的不同值?

转载 作者:行者123 更新时间:2023-11-30 15:16:23 25 4
gpt4 key购买 nike

我有几个全局变量,被 C 程序中的各种函数使用。我正在并行使用 OpenMP 线程。每个线程都会调用这些函数,为这些全局变量分配不同的值。除了 threadprivate 之外还有其他选择吗?我不清楚如何使用 copyin 子句。示例代码如下:

int main (void) {
int low=5,high=0;
----
func1(int *k) { do something with low,high and set value for k}
func2(int *k) { do something with low,high and set value for k}
func3(int *k) { do something with low,high and set value for k}
----
int i;
int *arr= malloc(CONSTANT1*sizeof(int));
#pragma omp parallel num_threads(numberOfThreads) threadprivate(low,high) private(i) shared(arr)
{
#pragma omp for
for(i=0;i<CONSTANT1;i++) {
low=low+CONSTANT2*i;
high=low+CONSTANT2;
func1(&arr[i]);
func2(&arr[i]);
func3(&arr[i]);
----
}
}
}

或者我应该使用private(low,high)并将它们一次又一次地传递给每个函数吗?请指教。

最佳答案

您的代码片段相当晦涩,但似乎有错误。让我们假设您在提出问题时考虑到以下内容:

int low=5, high=10;
#pragma omp threadprivate(low, high)

func1(int *k) { do something with low,high and set value for k}
func2(int *k) { do something with low,high and set value for k}
func3(int *k) { do something with low,high and set value for k}

[...]

int main (void) {
[...]
int i;
int *arr= malloc(CONSTANT1*sizeof(int));
#pragma omp parallel num_threads(numberOfThreads) private(i)
{
#pragma omp for
for (i=0; i<CONSTANT1; i++) {
low = low + CONSTANT2 * i;
high = low + CONSTANT2;
func1(&arr[i]);
func2(&arr[i]);
func3(&arr[i]);
[...]
}
}
}

然后,尽管使用 threadprivate 使代码有效,但由于 low = low + CONSTANT2 * i;,您会遇到问题。该行取决于先前的 low 值,因此不适合并行化,因为顺序很重要。但是,如果您像这样更改代码:

        int lowinit = low;
#pragma omp for
for (i=0; i<CONSTANT1; i++) {
low = lowinit + CONSTANT2 * i*(i+1)/2;

然后你的代码就变得正确了(前提是你的函数内部没有改变low)。

就性能而言,我不确定 highlow 的全局与参数方面会产生很大差异。但是,我很清楚,将它们作为参数而不是全局变量传递会使代码更加简洁并且不易出错。

最后,如果 highlow 的值在退出并行循环或区域时具有任何重要性,请注意这是主控的值将保留的线程,这可能与没有 OpenMP 时的线程不同。在这种情况下,您可以在必要时将这些行添加到代码中以确保正确性:

        low = lowinit + CONSTANT2 * (CONSTANT1-1)*CONSTANT1/2;
high = low + CONSTANT2;

关于c - 在 OpenMP 中,线程如何使用具有全局范围的变量的不同值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33127093/

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