gpt4 book ai didi

C++:OpenMP 共享内存保护

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:30 25 4
gpt4 key购买 nike

如果我使用一个共享变量,比方说 double 变量,来计算程序执行过程中的某种总和。无论如何,这是否容易受到不稳定操作的影响?我的意思是,是否有可能多个内核以异步方式访问此变量并导致不稳定的结果?

例如:这是一个全局变量:

double totalTime = 0;

在每个核心中调用一个命令:

totalTime += elapsedTime;

最后的操作/语句是通过获取 totalTime 的值,将其放入 CPU 寄存器,然后进行加法来执行的。我可以想象,多个核心会在同一时刻获取相同的值,然后添加新的 elapsedTime,然后由于延迟,存储在 totalTime 中的值将被错误的值覆盖。那可能吗?我该如何解决这个问题?

谢谢。

最佳答案

显然这个操作不是线程安全的,因为正如您自己提到的,它涉及多个汇编程序指令。事实上,openMP 甚至有针对此类操作的特殊指令。

您将需要 atomic pragma 来使其成为“原子”:

#pragma omp atomic
totalTime += elapsedTime;

请注意,atomic 仅在您对内存位置进行单个更新时才有效,例如加法、递增等。

如果你有一系列需要原子化的指令,你必须使用critical指令:

#pragma omp critical
{
// atomic sequence of instructions
}

编辑:这里有一个来自“snemarch”的好建议:如果您在并行循环中重复更新全局变量 totalTime,您可以考虑使用 reduction 子句使流程自动化并提高效率:

double totalTime = 0;

#pragma omp parallel for reduction(+:totalTime)
for(...)
{
...
totalTime += elapsedTime;
}

最后 totalTime 将正确包含本地 elapsedTime 值的总和,无需显式同步。

关于C++:OpenMP 共享内存保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10978012/

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