【问题标题】:Trying to pass different values to openMp thread in its thread function parameter尝试在其线程函数参数中将不同的值传递给 openMp 线程
【发布时间】:2022-01-12 10:07:54
【问题描述】:

我有这段代码,我试图弄清楚如何在 openMp 线程中将不同的值作为线程参数传递给

例如,我有一个简单的递减语句,例如 --t ,其中 t 是一个变量,因此每次调用线程函数时都会首先获取递减的 t 值,然后将其作为线程参数接收。这是我尝试过的

int main(int argc, char* argv[])
{

    int t=2;
    #pragma omp parallel firstprivate(t=(--t))
    {
        
        printf("%d\n",t);
    }
    
    // Ending of parallel region
}

所以我完全不知道上面的代码是如何使用的,因为我假设#pragma omp 指令的firstprivate(...) 部分只是使用 open mp 生成线程的一种方式,但我需要每个线程接收不同的参数。在openMM C中是否可行

【问题讨论】:

  • 如果有人给我关于 openmp 中某种共享变量的信息,它会相互添加线程参数的值,例如添加第一个线程参数和第二个线程参数等等,这将是很棒的openMp的共享变量

标签: c openmp


【解决方案1】:

firstprivate 子句中不可能这样做。但是,您可以将子句更改为 shared 并使用 atomic 构造 来安全地更新 值。这是一个例子:

int main(int argc, char* argv[])
{
    int t=2;

    #pragma omp parallel shared(t)
    {
        int local_t_value;

        #pragma omp atomic capture relaxed
        local_t_value = --t;

        printf("%d\n", local_t_value);
    }
}

请注意,capture 在此上下文中使用,因为原子值是同时获取和更新的。 relaxed 是一个内存排序,指定可以在不执行任何 flush 的情况下更新此值。更多信息请阅读this related part of the specification

【讨论】:

  • 感谢您的回答。请告诉是否也有任何关于 openMP 的文档
  • 只有官方的specification,有用的examples和非常有用的reference guide
  • @JérômeRichard "only" 可能有点意思。还有很多书籍和相当数量的在线教学资源。请参阅 openmp.org/resources/openmp-booksopenmp.org/resources/tutorials-articles 或直接使用搜索引擎。
  • @JimCownie “唯一”的意思是说(AFAIK)没有其他 OpenMP 文档文档由 OpenMP 架构审查委员会直接编写(并标记为,因此官方”)。我同意这个词不清楚/误用。当然,互联网和书籍上有很多替代资源。感谢您指出这一点。
猜你喜欢
  • 2016-01-20
  • 2011-02-18
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多