尝试在其线程函数参数中将不同的值传递给 openMp 线程
Trying to pass different values to openMp thread in its thread function parameter
我有这段代码,我试图找出如何将不同的值作为 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
中可行吗
不可能在 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 线程中的线程参数传递给
因此,例如我有一个简单的递减语句,如 --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
不可能在 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。