gpt4 book ai didi

c - 并行使用 pragma 进行构造

转载 作者:行者123 更新时间:2023-12-02 17:59:18 24 4
gpt4 key购买 nike

在我的 VS2010 C 代码中,我成功地使用了 pragma 指令:

 void doSomething(void)
{
n = doSomethingElse();
j = doOnceMore();
k = n + j;
}

#pragma omp parallel for
for (i = 0; i < 5; ++i)
{
doSomething();
}

但是如果我内联移动“doSomething()”的工作,我就无法让它工作:

    #pragma omp parallel for
for (int i = 0; i < 5; ++i)
{
n = doSomethingElse();
j = doOnceMore();
k = n + j;
}

我总是假设 pragma 指令会采用括号内的内容并为其分配一个唯一的线程。我对此完全错误吗?或者我应该使用其他一些 omp 语法吗?

最佳答案

n、j、k 默认情况下是线程共享的,因此它不起作用。当前,每个线程都同时在 n,j,k 上写入。

这取决于您想要做什么,它们是私有(private)的还是共享的。如果它们对于一个循环传递来说是本地的,您可以将它们声明为线程私有(private),并且它应该可以正常工作(循环计数器,这里的 i,默认情况下是线程私有(private)的)。

#pragma omp parallel for private(n,j,k)
for (int i = 0; i < 5; ++i)
{
n = doSomethingElse();
j = doOnceMore();
k = n + j;
}

由于 openmp 无法猜测变量的用途,因此您的工作就是告诉编译指示如何处理它们。您可以找到有关子句和变量的更多信息 here 。还有一个很好的talk关于 openmp webpage关于数据结构和构造适当的并行区域。

关于c - 并行使用 pragma 进行构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597792/

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