gpt4 book ai didi

c++ - 关键部分 openMP

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:33 25 4
gpt4 key购买 nike

我想知道我们需要在哪里设置临界区?

如果有多个线程共享一个数组,并且每个线程都想要写在不同的地方是否需要在关键部分,即使每个线程写入数组中的不同位置?

假设我有二维数组 M[3][3]、initial_array[3] 和一些 double 变量我想计算一些东西并将其存储在 M 的第一列。我可以使用 for 循环,但我想使用 openMP,所以我这样做了:

 omp_set_num_threads(3);
#pragma omp parallel shared(M,variable)
{
int id = omp_get_thread_num();
double init = initial_array[id]*variable;
M[id][0] = init;
}

它工作正常,但我知道它可能会导致死锁或运行时间不佳。我的意思是如果我有更多线程甚至更大的 M..设置临界区的正确方法是什么?我想问的另一件事是关于initial_array,它是否也需要共享?

最佳答案

这是安全代码。

数组中的随机访问不会对数组中的其他元素造成任何竞争条件。只要您继续并发读取和写入数组中的非共享元素,就永远不会遇到竞争条件。

请记住,根据元素的类型和大小,读取可能会与写入竞争。您的示例显示了 double,如果您在同一元素 上同时进行读取和写入操作,我会担心。写入期间可能会发生上下文切换,但这取决于您的架构/平台。无论如何,您没有这样做,但值得一提。

关于c++ - 关键部分 openMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415984/

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