尝试在其线程函数参数中将不同的值传递给 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 中编译?
使用 CreateThreadpoolWork/SubmitThreadpoolWork 时将不同的值传递给回调函数