gpt4 book ai didi

c - 默认情况下,OpenMP 将所有静态变量视为线程私有(private)的

转载 作者:太空狗 更新时间:2023-10-29 15:39:44 25 4
gpt4 key购买 nike

我有一个 C 函数,我需要在多个输入上并行运行。

我正在尝试使用 OpenMP 来这样做,问题是,我正在使用的函数正在使用一些内部静态变量来进行其自身的内部计算。

当尝试并行运行此函数的多个实例时,程序会由于多个线程正在访问同一内存区域而崩溃。

这可以通过将每个静态变量定义为“threadprivate”来解决,但由于我有很多内部变量,这有点过分了。

有没有办法让 OpenMP 默认将所有变量视为“线程私有(private)”?

最佳答案

没有这种可能。

不,你也许可以尝试一些冒险的#define static,但我强烈建议不要这样做。

事情是这样的。如果将所有函数替换为线程局部变量,则使用 static 的函数不会突然成为线程安全的。考虑:

int unique_number() {
static i = 0;
return i++; // surely this is unique!
}

如果你有跨调用捕获状态的函数,比如臭名昭著的 strtok,情况会变得更糟:

my_threadlocal_strtok(str, ...);
#pragma omp parallel for
for () {
my_threadlocal_strtok(NULL, ...); //
}

您必须考虑此静态(或现在的线程本地)状态的“生命周期”。

定义一堆 threadlocal 变量,这些变量曾经是 static 使得并行代码的推理变得更加困难,并且可能会引入细微的错误。顺便说一句,全局变量也是如此,这也使并行化变得更加困难。

归根结底,不要滥用 static 来跨调用存储状态。而是使用状态的显式句柄。如果您希望透明地缓存 数据,而使用static 时事情就会失控。您可以考虑使用显式初始化/访问函数抽象缓存的状态,然后更容易以线程安全/线程局部方式使用。这在 C++ 中比在 C 中容易得多。

关于c - 默认情况下,OpenMP 将所有静态变量视为线程私有(private)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57904366/

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