我试图在我的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) 我想使用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.:我还没有接受任何答案,因为我需要确定这个想法是好的.
我的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) 当我使用"#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) 假设我需要从磁盘上保存的同一文件中读取许多不同的独立数据块.
可以多线程上传这个吗?
相关:同一处理器上的所有线程是否使用相同的IO设备从磁盘读取?在这种情况下,多线程根本不会加速上传 - 线程只是排队等候.
(我目前正在使用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.cmake或openmp-config.cmake.我需要做些什么来解决这个问题?
我在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<double>* mFourierValues;mFourierValues[idx] = newValue;mFourierValues[idx] == newValue,这种检查会不时失败(尽管不是每次结果都不正确).所以症状看起来像是在没有任何同步的情况下同时访问元素.但是,当我将索引存储在std::vector(使用适当的#pragma omp critical)时,所有指标都是唯一的并且在正确的范围内.
经过几天的调试,我的怀疑越来越多,其他事情正在发生,我的代码是正确的.对我来说,当CPU将缓存与主内存同步时,看起来很奇怪.
因此,我的问题是:
[编辑:删除旧代码,见下文]
好的,我终于能够生成一个更短(和自我一致)的代码示例.
complex<double> mAllElements[tensorIdx][kappa1][kappa2][kappa3].即我有3个Rank-3-tensors(tensorIdx).每个张量代表一个三维数组,索引为kappa1,kappa2和kappa3.kappa1循环是被并行化的循环(并且是最外层的循环).它们位于DoComputation().main(),我打电话DoComputation()一次得到一些参考值,然后我多次调用它并比较结果.它们应该完全匹配,但有时它们不匹配.不幸的是,代码仍然长约190行.我试图进一步简化它(只有1张等级1,等等),但后来我再也无法重现这个问题了.我想这是因为内存访问是非对齐的(循环tensorIdx是最里面的)(我知道,这远非最优.)
此外,在适当的地方需要一些延迟,以重现错误.这就是nops()电话的原因.没有它们,代码运行得更快,但到目前为止还没有显示出问题.
请注意,我CalcElementIdx() …
我正在尝试实现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) $ 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编译程序呢?
我使用的是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)时,编译成功.)