如何让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++代码在两个不同的内核上运行.它们都写入同一个文件.
如何使用OpenMP并确保没有崩溃?
如果我像这样使用嵌套并行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)
除了创建新任务之外,做外部并行吗?
我写了这个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
我知道你不能有一个OpenMP循环的break语句,但我想知道是否有任何解决方法,同时仍然受益于并行性.基本上我有'for'循环,循环遍历大向量的元素,寻找满足某个条件的一个元素.但是只有一个元素可以满足条件,所以一旦发现我们可以突破循环,提前谢谢
for(int i = 0; i <= 100000; ++i)
{
if(element[i] ...)
{
....
break;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试并行化一个非常简单的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) 我遇到了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) 我需要在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)
因此,没有铿锵的证据.我是否有必要更改存储库或类似的东西?
我有使用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) 我正在研究OpenMP的调度,特别是不同的类型.我理解每种类型的一般行为,但澄清将有助于何时选择dynamic和guided安排.
英特尔的文档描述了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反之亦然?