标签: openmp

在Mac OS上使用OpenMP和C++ 11

我试图在我的C++ 11代码中使用一些OpenMP多线程功能,如:

#pragma omp parallel for
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时使用:

clang++ -std=c++11 -stdlib=libc++ -fopenmp main.cpp -o main.o
Run Code Online (Sandbox Code Playgroud)

我得到以下错误:

clang: error: unsupported option '-fopenmp'
Run Code Online (Sandbox Code Playgroud)

我或者尝试使用以下编译:

g++ -fopenmp main.cpp -o main.o
Run Code Online (Sandbox Code Playgroud)

但这给出了完全相同的错误.

非常感谢,如果您可以建议如何在Mac OS 10.12上编译具有OpenMP功能的C++ 11代码.关于这里和其他地方的帖子的其他问题解释了为OpenMP编译C代码,但是,我找不到C++ 11的任何内容.

我尝试安装libiomp时遇到错误,我收到错误:

$ brew install libiomp
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
ansible-cmdb        djview4             khard               oysttyer            shyaml              yazpp             
asciinema2gif       doctl               macvim              pazpar2             vala                you-get           
avro-c              elixir              mailhog             python              vdirsyncer          youtube-dl        
bash-git-prompt     file-roller         meson               python3             vim               
commandbox          glib                metaproxy           rtv                 x265              
consul-backinator   gtkextra            offlineimap         s-search            xonsh …
Run Code Online (Sandbox Code Playgroud)

c++ openmp c++11 macos-sierra

15
推荐指数
1
解决办法
9454
查看次数

如何并行生成随机数?

我想使用openMP并行生成伪随机数,如下所示:

int i;
#pragma omp parallel for
for (i=0;i<100;i++)
{
    printf("%d %d %d\n",i,omp_get_thread_num(),rand());
} 
return 0; 
Run Code Online (Sandbox Code Playgroud)

我已经在Windows上测试了它,并且我获得了巨大的加速,但每个线程生成了完全相同的数字.我已经在Linux上测试了它并且我得到了巨大的减速,8核处理器上的并行版本比顺序慢了大约10倍,但是每个线程生成了不同的数字.

有没有办法同时加速和不同的数字?

编辑27.11.2010
我想我已经用乔纳森杜尔西的一个想法解决了这个问题.似乎下面的代码在linux和windows上运行得很快.数字也是伪随机的.你怎么看待这件事?

int seed[10];

int main(int argc, char **argv) 
{
int i,s;
for (i=0;i<10;i++)
    seed[i] = rand();

#pragma omp parallel private(s)
{
    s = seed[omp_get_thread_num()];
    #pragma omp for
    for (i=0;i<1000;i++)
    {
        printf("%d %d %d\n",i,omp_get_thread_num(),s);
        s=(s*17931+7391); // those numbers should be choosen more carefully
    }
    seed[omp_get_thread_num()] = s;
}
return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

PS.:我还没有接受任何答案,因为我需要确定这个想法是好的.

c random openmp

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

openMP不在visual studio中创建线程

我的openMP版本没有提供任何速度提升.我有一个双核机器,CPU使用率总是50%.所以我尝试了Wiki中给出的示例程序.看起来openMP编译器(Visual Studio 2008)不会创建多个线程.

这是该计划:

 #include <omp.h>
 #include <stdio.h>
 #include <stdlib.h>

 int main (int argc, char *argv[]) {
   int th_id, nthreads;
   #pragma omp parallel private(th_id)
   {
     th_id = omp_get_thread_num();
     printf("Hello World from thread %d\n", th_id);
     #pragma omp barrier
     if ( th_id == 0 ) {
       nthreads = omp_get_num_threads();
       printf("There are %d threads\n",nthreads);
     }
   }
   return EXIT_SUCCESS;
 }
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

Hello World from thread 0
There are 1 threads
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

openmp

14
推荐指数
1
解决办法
9056
查看次数

openMP:当我使用"#pragma omp parallel num_threads(4)"时,为什么我得不到不同的线程ID

当我使用"#pragma omp parallel num_threads(4)"时,为什么我没有获得不同的线程ID.在这种情况下,所有线程ID都为0.但是当我评论该行并使用默认的线程数时,我得到了不同的线程ID.注意: - 变量我使用变量tid来获取线程ID.

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) 
{
int nthreads, tid;
int x = 0;

#pragma omp parallel num_threads(4)
#pragma omp parallel private(nthreads, tid)
  {
  /* Obtain thread number */
 tid = omp_get_thread_num();
  printf("Hello World from thread = %d\n", tid);

  // /* Only master thread does this */
   if (tid == 0) 
     {
     nthreads = omp_get_num_threads();
     printf("Number of threads = %d\n", nthreads);
     }

  }


}
Run Code Online (Sandbox Code Playgroud)

上述代码的输出: -

Hello World …
Run Code Online (Sandbox Code Playgroud)

c parallel-processing multithreading openmp

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

多线程从磁盘读取?

假设我需要从磁盘上保存的同一文件中读取许多不同的独立数据块.

可以多线程上传这个吗?

相关:同一处理器上的所有线程是否使用相同的IO设备从磁盘读取?在这种情况下,多线程根本不会加速上传 - 线程只是排队等候.

(我目前正在使用OpenMP进行多线程处理.)

c++ io multithreading openmp

14
推荐指数
2
解决办法
6137
查看次数

CMake无法找到OpenMP

我正在尝试使用OpenMP进行编译.我CMakeLists.txt包含这条线

find_package(OpenMP REQUIRED)

和CMake错误

CMake Error at /opt/ros/groovy/share/catkin/cmake/catkinConfig.cmake:72 (find_package):
  Could not find a configuration file for package openmp.

  Set openmp_DIR to the directory containing a CMake configuration file for
  openmp.  The file will have one of the following names:

    openmpConfig.cmake
    openmp-config.cmake
Run Code Online (Sandbox Code Playgroud)

检查我的文件系统,我看到我有/usr/share/cmake-2.8/Modules/FindOpenMP.cmake但没有openmpConfig.cmakeopenmp-config.cmake.我需要做些什么来解决这个问题?

cmake openmp

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

双插槽系统上的OpenMP

我在C++中进行了一些科学计算,并尝试利用OpenMP来实现某些循环的并行化.到目前为止,这种方法运行良好,例如在具有8个线程的Intel i7-4770上.

建立

我们在一个主板上有一个小型工作站,由两个Intel CPU(E5-2680v2)组成.代码可以工作,只要它在1个CPU上运行,并且拥有尽可能多的线程.但是一旦我使用第二个CPU,我会不时观察到不正确的结果(大约每50到100次运行代码).即使我只使用2个线程并将它们分配给两个不同的CPU,也会发生这种情况.由于我们有5个这样的工作站(都是相同的),我在每个工作站上运行代码,并且都显示了这个问题.

该工作站在OpenSuse 13.1,内核3.11.10-7上运行.问题存在于g ++ 4.8.1和4.9.0,以及英特尔的icc 13.1.3.192(尽管问题不会经常发生在icc上,但它仍然存在).

症状

症状可描述如下:

  • 我有一大堆std :: complex: std::complex<double>* mFourierValues;
  • 在循环中,我访问并设置每个元素.每次迭代访问一个不同的元素,所以我没有并发访问(我检查了这个):mFourierValues[idx] = newValue;
  • 如果我事后将set array-value与输入值进行比较,粗略地说mFourierValues[idx] == newValue,这种检查会不时失败(尽管不是每次结果都不正确).

所以症状看起来像是在没有任何同步的情况下同时访问元素.但是,当我将索引存储在std::vector(使用适当的#pragma omp critical)时,所有指标都是唯一的并且在正确的范围内.

问题

经过几天的调试,我的怀疑越来越多,其他事情正在发生,我的代码是正确的.对我来说,当CPU将缓存与主内存同步时,看起来很奇怪.

因此,我的问题是:

  • OpenMP甚至可以用于这样的系统吗?(我没有找到一个说不的来源.)
  • 是否存在针对这种情况的已知错误(我没有在错误跟踪器中找到任何错误)?
  • 您认为问题可能在哪里?
    • 我的代码(似乎在具有多个内核的1个CPU上运行良好!),
    • 编译器(gcc,icc both!),
    • 操作系统,
    • 硬件(所有5个工作站上的缺陷?)

[编辑:删除旧代码,见下文]

用最少的例子编辑

好的,我终于能够生成一个更短(和自我一致)的代码示例.

关于代码

  • 保留一些内存空间.堆栈上的阵列,这将被访问的,如:complex<double> mAllElements[tensorIdx][kappa1][kappa2][kappa3].即我有3个Rank-3-tensors(tensorIdx).每个张量代表一个三维数组,索引为kappa1,kappa2kappa3.
  • 我有4个嵌套循环(在所有4个索引上),而kappa1循环是被并行化的循环(并且是最外层的循环).它们位于DoComputation().
  • main(),我打电话DoComputation()一次得到一些参考值,然后我多次调用它并比较结果.它们应该完全匹配,但有时它们不匹配.

不幸的是,代码仍然长约190行.我试图进一步简化它(只有1张等级1,等等),但后来我再也无法重现这个问题了.我想这是因为内存访问是非对齐的(循环tensorIdx是最里面的)(我知道,这远非最优.)

此外,在适当的地方需要一些延迟,以重现错误.这就是nops()电话的原因.没有它们,代码运行得更快,但到目前为止还没有显示出问题.

请注意,我CalcElementIdx() …

c++ multithreading synchronization openmp

14
推荐指数
1
解决办法
1101
查看次数

C++中的N体仿真

我正在尝试实现2维n体仿真的OpenMP版本.

但是存在一个问题:我假设每个粒子的初始速度和加速度都为零.当颗粒首先聚集在一起时,它们会高速分散,不再聚集.

这似乎与牛顿法不一致,对吧?

有人可以解释为什么会发生这种情况以及如何解决错误?

这是我的代码的一部分:

/* update one frame */
void update() {
    int i, j;

    omp_set_num_threads(8);
    # pragma omp parallel private(j)
    {

    # pragma omp for schedule(static)
        for ( i = 0; i < g_N; ++i ) {
            g_pv[i].a_x = 0.0;
            g_pv[i].a_y = 0.0;
            for ( j = 0; j < g_N; ++j ) {
                if (i == j)
                    continue;
                double r_2 = pow((g_pv[i].pos_x - g_pv[j].pos_x),2) + pow((g_pv[i].pos_y - g_pv[j].pos_y),2);
                g_pv[i].a_x += (-1) * G * g_pv[j].m …
Run Code Online (Sandbox Code Playgroud)

c++ simulation physics openmp numerical-methods

14
推荐指数
1
解决办法
3475
查看次数

在OS X Yosemite上使用gcc编译器编译OpenMP程序

$ gcc 12.c -fopenmp
12.c:9:9: fatal error: 'omp.h' file not found
#include<omp.h>
    ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

在编译openMP程序时,我得到了上述错误.我正在使用OS X Yosemite.我首先尝试通过在终端中键入gcc来安装本机gcc编译器,后来又下载了Xcode,我得到了同样的错误.然后我下载了gcc:

$ brew install gcc
Run Code Online (Sandbox Code Playgroud)

我仍然得到同样的错误.我确实尝试更改编译器路径,它仍显示:

$ which gcc
/usr/bin/gcc
Run Code Online (Sandbox Code Playgroud)

那么如何用gcc编译程序呢?

c c++ xcode gcc openmp

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

在Mac OS X(sierra&Mojave)中的clang中启用OpenMP支持

我使用的是Mac OS X Sierra,我发现clang(LLVM版本8.1.0(clang-802.0.38))不支持OpenMP:当我运行时clang -fopenmp program_name.c,我收到以下错误:

clang: error: unsupported option '-fopenmp'

似乎clang不支持-fopenmp旗帜.

我在自制软件中找不到任何openmp库.根据LLVM网站,LLVM已经支持OpenMP.但是在编译期间我找不到启用它的方法.

这是否意味着Mac中的默认clang不支持OpenMP?你能提供什么建议吗?

(当我切换到GCC编译相同的程序(使用gcc安装brew install gcc --without-multilib)时,编译成功.)

macos openmp llvm clang

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