标签: openmp

OpenMP中的原子和关键有什么区别?

OpenMP中的原子和关键有什么区别?

我可以做这个

#pragma omp atomic
g_qCount++;
Run Code Online (Sandbox Code Playgroud)

但是不一样

#pragma omp critical
g_qCount++;
Run Code Online (Sandbox Code Playgroud)

atomic openmp critical-section

103
推荐指数
5
解决办法
7万
查看次数

omp parallel与omp parallel for

这两者有什么区别?

[一个]

#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)

openmp

98
推荐指数
7
解决办法
16万
查看次数

犰狳是否解决()线程安全?

在我的代码中,我有循环,我构建和确定线性系统,并尝试解决它:

#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)

c++ multithreading openmp blas armadillo

86
推荐指数
1
解决办法
2633
查看次数

为什么OpenMP不允许使用!=运算符?

我试图编译以下代码:

#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++),虽然我可以把"<"或"<=".

c c++ parallel-processing multithreading openmp

69
推荐指数
3
解决办法
5515
查看次数

firstPrivate和lastprivate与OpenMP中的private子句有何不同?

我看过官方的定义,但我仍然很困惑.

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.

openmp

69
推荐指数
2
解决办法
5万
查看次数

使用OpenMP和C++ 11基于范围的for循环?

这样做是否有任何反指示?或者是否明确规定了行为?

#pragma omp parallel for
for(auto x : stl_container)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

因为看起来OpenMP规范只对c ++ 98有效,但我想由于C++ 11线程可能存在更多的不兼容性,这里没有使用它们.我还是想确定一下.

openmp c++11

62
推荐指数
2
解决办法
1万
查看次数

Pthreads与OpenMP

我正在使用Linux在C中创建一个多线程应用程序.

我不确定是否应该使用POSIX线程API或OpenMP API.

使用任何一种的利弊是什么?

编辑:

有人可以澄清两个API是否创建内核级用户级线程?

c pthreads openmp

57
推荐指数
4
解决办法
4万
查看次数

OpenMP和Python

我有为共享内存机器(在C和FORTRAN中)编码OpenMP的经验,可以执行矩阵添加,乘法等简单任务(只是为了看看它与LAPACK的竞争).我知道OpenMP足以执行简单的任务而无需查看文档.

最近,我为我的项目转移到Python,除了绝对的基础知识,我没有任何Python经验.

我的问题是:

在Python中使用OpenMP 最简单的方法是什么?最简单的,我的意思是那个在程序员方面花费最少的工作(即使是以增加的系统时间为代价)?

我使用OpenMP的原因是因为串行代码可以转换为一个工作的并行代码,其中有几个!$OMP散布在周围.实现粗略并行化所需的时间非常小.有没有办法在Python中复制这个功能?

通过浏览SO,我可以找到:

  • C扩展
  • StackLess Python

还有更多吗?哪个与我的问题最符合?

python parallel-processing openmp

53
推荐指数
6
解决办法
7万
查看次数

OpenMP:局部变量是否自动私有?

#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如果局部变量是自动私有的,那么使用私有子句有什么意义呢?

c c++ parallel-processing openmp

52
推荐指数
2
解决办法
3万
查看次数

vs omp simd并行:什么时候使用?

OpenMP 4.0引入了一个名为"omp simd"的新结构.使用这种结构比旧的"并行"有什么好处?什么时候会比另一个更好?

编辑:这是一篇与SIMD指令相关的有趣论文.

c c++ performance simd openmp

50
推荐指数
2
解决办法
2万
查看次数