OpenMP中的原子和关键有什么区别?
我可以做这个
#pragma omp atomic
g_qCount++;
Run Code Online (Sandbox Code Playgroud)
但是不一样
#pragma omp critical
g_qCount++;
Run Code Online (Sandbox Code Playgroud)
?
这两者有什么区别?
[一个]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Run Code Online (Sandbox Code Playgroud) 在我的代码中,我有循环,我构建和确定线性系统,并尝试解决它:
#pragma omp parallel for
for (int i = 0; i < n[0]+1; i++) {
for (int j = 0; j < n[1]+1; j++) {
for (int k = 0; k < n[2]+1; k++) {
arma::mat A(max_points, 2);
arma::mat y(max_points, 1);
// initialize A and y
arma::vec solution = solve(A,y);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有时,程序会随机挂起,或者解决方案向量中的结果是NaN.如果我这样做:
arma::vec solution;
#pragma omp critical
{
solution = solve(weights*A,weights*y);
}
Run Code Online (Sandbox Code Playgroud)
然后这些问题似乎不再发生了.
当它挂起时,它会这样做,因为有些线程正在等待OpenMP屏障:
Thread 2 (Thread 0x7fe4325a5700 (LWP 39839)):
#0 0x00007fe44d3c2084 in gomp_team_barrier_wait_end () from /usr/lib64/gcc-4.9.2/lib64/gcc/x86_64-redhat-linux-gnu/4.9.2/libgomp.so.1
#1 …Run Code Online (Sandbox Code Playgroud) 我试图编译以下代码:
#pragma omp parallel shared (j)
{
#pragma omp for schedule(dynamic)
for(i = 0; i != j; i++)
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:错误:控制谓词无效.
我检查了openMP 参考指南,它说对于它的并行"仅"允许以下运算符之一:<=>> =.
我不明白为什么不允许i != j.我可以理解它是否是静态调度,因为openMP需要预先计算分配给每个线程的迭代次数.但我无法理解为什么在这种情况下这种限制为例.有线索吗?
编辑:即使我做for(i = 0; i != 100; i++),虽然我可以把"<"或"<=".
我看过官方的定义,但我仍然很困惑.
firstprivate:指定每个线程应该有自己的变量实例,并且应该使用变量的值初始化变量,因为它存在于并行构造之前.
对我来说,这听起来很像私人.我找了一些例子,但我似乎不明白它的特殊性或如何使用它.
lastprivate:指定将封闭上下文的变量版本设置为等于执行最终迭代(for-loop构造)或最后一个部分(#pragma sections)的任何线程的私有版本.
由于以下示例,我觉得我更了解这一点:
#pragma omp parallel
{
#pragma omp for lastprivate(i)
for (i=0; i<n-1; i++)
a[i] = b[i] + b[i+1];
}
a[i]=b[i];
Run Code Online (Sandbox Code Playgroud)
所以,在这个例子中,我理解lastprivate允许i在循环之外作为最后一个值返回.
我今天刚开始学习OpenMP.
这样做是否有任何反指示?或者是否明确规定了行为?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
Run Code Online (Sandbox Code Playgroud)
因为看起来OpenMP规范只对c ++ 98有效,但我想由于C++ 11线程可能存在更多的不兼容性,这里没有使用它们.我还是想确定一下.
我正在使用Linux在C中创建一个多线程应用程序.
我不确定是否应该使用POSIX线程API或OpenMP API.
使用任何一种的利弊是什么?
编辑:
有人可以澄清两个API是否创建内核级或用户级线程?
我有为共享内存机器(在C和FORTRAN中)编码OpenMP的经验,可以执行矩阵添加,乘法等简单任务(只是为了看看它与LAPACK的竞争).我知道OpenMP足以执行简单的任务而无需查看文档.
最近,我为我的项目转移到Python,除了绝对的基础知识,我没有任何Python经验.
我的问题是:
在Python中使用OpenMP 最简单的方法是什么?最简单的,我的意思是那个在程序员方面花费最少的工作(即使是以增加的系统时间为代价)?
我使用OpenMP的原因是因为串行代码可以转换为一个工作的并行代码,其中有几个!$OMP散布在周围.实现粗略并行化所需的时间非常小.有没有办法在Python中复制这个功能?
通过浏览SO,我可以找到:
还有更多吗?哪个与我的问题最符合?
#pragma omp parallel
{
int x; // private to each thread ?
}
#pragma omp parallel for
for (int i = 0; i < 1000; ++i)
{
int x; // private to each thread ?
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
PS如果局部变量是自动私有的,那么使用私有子句有什么意义呢?
OpenMP 4.0引入了一个名为"omp simd"的新结构.使用这种结构比旧的"并行"有什么好处?什么时候会比另一个更好?