尝试在其线程函数参数中将不同的值传递给 openMp 线程

Posted

技术标签:

【中文标题】尝试在其线程函数参数中将不同的值传递给 openMp 线程【英文标题】:Trying to pass different values to openMp thread in its thread function parameter 【发布时间】: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的共享变量 【参考方案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-books 和 openmp.org/resources/tutorials-articles 或直接使用搜索引擎。 @JimCownie “唯一”的意思是说(AFAIK)没有其他 OpenMP 文档文档由 OpenMP 架构审查委员会直接编写(并标记为,因此官方”)。我同意这个词不清楚/误用。当然,互联网和书籍上有很多替代资源。感谢您指出这一点。

以上是关于尝试在其线程函数参数中将不同的值传递给 openMp 线程的主要内容,如果未能解决你的问题,请参考以下文章

如果我尝试在不同的公共类中将数组作为参数传递,为啥我的构造函数无法在 Java 中编译?

在 C++ 中将不同大小的常量数组作为函数参数传递

在 boost::thread 中将参数传递给函数

使用 CreateThreadpoolWork/SubmitThreadpoolWork 时将不同的值传递给回调函数

在 Kotlin Android 中将值传递给函数时进行编译时间检查

在类构造函数中将此指针传递给 CreateThread 在线程过程中表现得很奇怪