标签: openmp

在Mac OS X 10.11上安装OpenMP

如何让OpenMP在Mac OSX 10.11上运行,以便我可以通过终端执行脚本?

我已经安装了OpenMP : brew install clang-omp.

当我运行时,例如:gcc -fopenmp -o Parallel.b Parallel.c以下表达式返回:fatal error: 'omp.h' file not found

我也尝试过:brew install gcc --without-multilib但不幸的是,这最终返回了以下内容(在首次安装一些依赖项之后):

The requested URL returned error: 404 Not Found
Error: Failed to download resource "mpfr--patch"
Run Code Online (Sandbox Code Playgroud)

任何推荐的工作?

c gcc openmp

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

如何在OpenMP中使用锁?

我有两个C++代码在两个不同的内核上运行.它们都写入同一个文件.

如何使用OpenMP并确保没有崩溃?

c++ locking openmp critical-section

23
推荐指数
3
解决办法
5万
查看次数

openMP嵌套并行for循环vs内部并行for

如果我像这样使用嵌套并行for循环:

#pragma omp parallel for schedule(dynamic,1)
for (int x = 0; x < x_max; ++x) {
    #pragma omp parallel for schedule(dynamic,1)
    for (int y = 0; y < y_max; ++y) { 
    //parallelize this code here
   }
//IMPORTANT: no code in here
}
Run Code Online (Sandbox Code Playgroud)

这相当于:

for (int x = 0; x < x_max; ++x) {
    #pragma omp parallel for schedule(dynamic,1)
    for (int y = 0; y < y_max; ++y) { 
    //parallelize this code here
   }
//IMPORTANT: no code in here
}
Run Code Online (Sandbox Code Playgroud)

除了创建新任务之外,做外部并行吗?

c++ parallel-processing openmp

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

为什么这段代码不能线性扩展?

我写了这个SOR求解器代码.不要太费心这个算法做什么,这不是关注点.但仅仅是为了完整性:它可以解决线性方程组,这取决于系统的条件有多好.

我用一个病态的2097152行sparce矩阵(从不收敛)运行它,每行最多7个非零列.

翻译:外部do-while循环将执行10000次迭代(我传递的值为max_iters),中间for将执行2097152次迭代,分割成块work_line,在OpenMP线程之间划分.最里面的for循环将有7次迭代,除非极少数情况下(小于1%)它可以更少.

sol数组值中的线程之间存在数据依赖性.中间的每次迭代都会for更新一个元素,但最多可读取数组的其他6个元素.由于SOR不是一个精确的算法,在读取时,它可以具有该位置上的任何先前值或当前值(如果您熟悉求解器,这是一个Gauss-Siedel,在某些地方容忍Jacobi行为,为了并行).

typedef struct{
    size_t size;

    unsigned int *col_buffer;
    unsigned int *row_jumper;
    real *elements;
} Mat;

int work_line;

// Assumes there are no null elements on main diagonal
unsigned int solve(const Mat* matrix, const real *rhs, real *sol, real sor_omega, unsigned int max_iters, real tolerance)
{
    real *coefs = matrix->elements;
    unsigned int *cols = matrix->col_buffer;
    unsigned int *rows = matrix->row_jumper;
    int size = matrix->size;
    real …
Run Code Online (Sandbox Code Playgroud)

c multithreading openmp computer-architecture multiprocessing

23
推荐指数
2
解决办法
1887
查看次数

带有break语句的并行OpenMP循环

我知道你不能有一个OpenMP循环的break语句,但我想知道是否有任何解决方法,同时仍然受益于并行性.基本上我有'for'循环,循环遍历大向量的元素,寻找满足某个条件的一个元素.但是只有一个元素可以满足条件,所以一旦发现我们可以突破循环,提前谢谢

for(int i = 0; i <= 100000; ++i)
  {
    if(element[i] ...)
     {
          ....
          break;
      }
   }
Run Code Online (Sandbox Code Playgroud)

c++ multithreading loops openmp

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

在openmp中并行循环

我正在尝试并行化一个非常简单的for循环,但这是我在很长一段时间内第一次尝试使用openMP.我对运行时间感到困惑.这是我的代码:

#include <vector>
#include <algorithm>

using namespace std;

int main () 
{
    int n=400000,  m=1000;  
    double x=0,y=0;
    double s=0;
    vector< double > shifts(n,0);


    #pragma omp parallel for 
    for (int j=0; j<n; j++) {

        double r=0.0;
        for (int i=0; i < m; i++){

            double rand_g1 = cos(i/double(m));
            double rand_g2 = sin(i/double(m));     

            x += rand_g1;
            y += rand_g2;
            r += sqrt(rand_g1*rand_g1 + rand_g2*rand_g2);
        }
        shifts[j] = r / m;
    }

    cout << *std::max_element( shifts.begin(), shifts.end() ) << endl;
}
Run Code Online (Sandbox Code Playgroud)

我用它编译它

g++ -O3 …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing openmp

22
推荐指数
3
解决办法
5万
查看次数

在Mavericks的GCC版本(4.2.1)中找不到<omp.h>库

我遇到了GCC的问题.我想将它更新到一个新版本,从4.2.1到用并行编程编程.但是,在这个版本中没有库.我该如何下载更新版本?

终端给我的错误是:

omp_hello.c:11:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

gcc openmp osx-mavericks

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

brew install clang-omp无法正常工作

我需要在Mac上使用OpenMP编译C++代码.不幸的是,Mac上安装的默认版本的clang(703.0.31)不支持OpenMP.因此,我正在尝试使用brew安装clang-omp包(例如,遵循指南).问题是brew找不到libiomp,也找不到clang-omp包:

$ brew install clang-omp
Error: No available formula with the name "clang-omp"
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
Error: No formulae found in taps.
Run Code Online (Sandbox Code Playgroud)

我想知道clang-omp是否仍由brew提供.或者我做错了什么?有任何想法吗?

编辑:如果我做brew搜索,我得到以下内容:

$ brew search clang
clang-format           emacs-clang-complete-async
Caskroom/cask/openclonk-c54d917-darwin-amd64-clang
Run Code Online (Sandbox Code Playgroud)

因此,没有铿锵的证据.我是否有必要更改存储库或类似的东西?

homebrew openmp clang osx-elcapitan

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

使用omp_set_num_threads()设置线程数为2,但是omp_get_num_threads()返回1

我有使用OpenMP的以下C/C++代码:

    int nProcessors=omp_get_max_threads();
    if(argv[4]!=NULL){
        printf("argv[4]: %s\n",argv[4]);
        nProcessors=atoi(argv[4]);
        printf("nProcessors: %d\n",nProcessors);
    }
    omp_set_num_threads(nProcessors);
    printf("omp_get_num_threads(): %d\n",omp_get_num_threads());
    exit(0);
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在尝试根据命令行传递的参数设置要使用的处理器数量.

但是,我得到以下输出:

argv[4]: 2   //OK
nProcessors: 2   //OK
omp_get_num_threads(): 1   //WTF?!
Run Code Online (Sandbox Code Playgroud)

为什么不omp_get_num_threads()回2?!!!


正如已经指出的那样,我omp_get_num_threads()在一个串行区域调用,因此函数返回1.

但是,我有以下并行代码:

#pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected)
    for(i=0;i<fileLen-CHUNKSIZE;i++){
        tid=omp_get_thread_num();
        printf("%d\n",tid);
        int nThreads=omp_get_num_threads();
        printf("%d\n",nThreads);
...
Run Code Online (Sandbox Code Playgroud)

哪个输出:

0   //tid
1   //nThreads - this should be 2!
0
1
0
1
0
1
...
Run Code Online (Sandbox Code Playgroud)

c c++ parallel-processing openmp

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

OpenMP动态与引导式调度

我正在研究OpenMP的调度,特别是不同的类型.我理解每种类型的一般行为,但澄清将有助于何时选择dynamicguided安排.

英特尔的文档描述了dynamic调度:

使用内部工作队列为每个线程提供一个块大小的循环迭代块.线程完成后,它会从工作队列的顶部检索下一个循环迭代块.默认情况下,块大小为1.使用此调度类型时要小心,因为涉及额外的开销.

它还描述了guided调度:

与动态调度类似,但块大小从大开始减小以更好地处理迭代之间的负载不平衡.可选的chunk参数指定它们使用的最小大小块.默认情况下,块大小约为loop_count/number_of_threads.

由于guided调度在运行时动态地减少了块大小,为什么我会使用dynamic调度?

我研究过这个问题,从达特茅斯找到了这张桌子:

在此输入图像描述

guided被列为具有high开销,同时dynamic具有中等开销.

这最初是有意义的,但经过进一步调查,我读了一篇关于该主题的英特尔文章.从上一张表中可以看出,guided由于在运行时分析和调整块大小(即使正确使用),理论调度也会花费更长的时间.但是,在英特尔文章中它指出:

引导时间表最适合小块大小作为其限制; 这提供了最大的灵活性.目前尚不清楚为什么它们在更大的块尺寸下会变得更糟,但是当它们被限制在大块尺寸时它们可能会花费太长时间.

为什么块大小与guided花费更长时间相关dynamic?通过将块大小锁定得太高而导致性能损失缺乏"灵活性"是有意义的.但是,我不会将其描述为"开销",锁定问题会破坏先前的理论.

最后,它在文章中说明:

动态计划提供了最大的灵活性,但在计划错误时可以获得最大的性能影响.

dynamic调度比最优化更有意义static,但为什么它比最优化guided?这只是我在质疑的开销吗?

这个有点相关的SO帖子解释了与调度类型相关的NUMA.这与此问题无关,因为所需的组织因这些调度类型的"先到先得"行为而丢失.

dynamic调度可能是合并的,导致性能提高,但同样的假设应该适用guided.

以下是英特尔文章中不同块大小的每种调度类型的时序,以供参考.它只是来自一个程序的记录,一些规则适用于每个程序和机器(特别是调度),但它应该提供一般趋势.

在此输入图像描述

编辑(我的问题的核心):

  • 是什么影响了guided调度的运行时间?具体例子?为什么它比dynamic某些情况慢?
  • 我什么时候会偏爱guided,dynamic反之亦然?
  • 一旦解释了这个,上面的来源是否支持您的解释?他们完全矛盾吗?

c++ parallel-processing multithreading scheduling openmp

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