我在谷歌搜索提供一些简单的OpenMp算法的页面.可能有一个例子来计算巨大数据阵列的最小值,最大值,中值,平均值,但我无法找到它.
至少我通常会尝试将数组划分为每个核心的一个块,然后进行一些边界计算以获得完整数组的结果.
我只是不想重新发明轮子.
补充说明:我知道有成千上万的例子可以简单地减少.例如,计算PI.
const int num_steps = 100000;
double x, sum = 0.0;
const double step = 1.0/double(num_steps);
#pragma omp parallel for reduction(+:sum) private(x)
for (int i=1;i<= num_steps; i++){
x = double(i-0.5)*step;
sum += 4.0/(1.0+x*x);
}
const double pi = step * sum;
Run Code Online (Sandbox Code Playgroud)
但是当这些算法不可用时,几乎没有留下用于减少算法的例子.
我正在以顺序方式运行.cpp代码(i)和(ii)使用OpenMP语句.我想看看时差.为了计算时间,我用这个:
#include <time.h>
.....
main()
{
clock_t start, finish;
start = clock();
.
.
.
finish = clock();
processing time = (double(finish-start)/CLOCKS_PER_SEC);
}
Run Code Online (Sandbox Code Playgroud)
在代码的顺序(上面)运行中,时间非常准确.运行它需要大约8秒钟.当我在代码中插入OpenMP语句然后计算时间缩短时,但是在控制台上显示的时间大约为8-9秒,实际上它实际上只有3-4秒!
以下是我的代码抽象的样子:
#include <time.h>
.....
main()
{
clock_t start, finish;
start = clock();
.
.
#pragma omp parallel for
for( ... )
for( ... )
for (...)
{
...;
}
.
.
finish = clock();
processing time = (double(finish-start)/CLOCKS_PER_SEC);
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我得到了减少的时间,但显示的时间在实时方面并不准确.在我看来,似乎clock()函数正在计算每个线程的个别时间并将它们相加并显示它们.
有人能说出这个的原因或建议我使用任何其他计时功能来衡量OpenMP程序的时间吗?
谢谢.
我正在使用C++中的OpenMP编写并行程序.
我想控制程序中使用的线程数omp_set_num_threads(),但它不起作用.
#include <iostream>
#include <omp.h>
#include "mpi.h"
using namespace std;
int myrank;
int groupsize;
double sum;
double t1,t2;
int n = 10000000;
int main(int argc, char *argv[])
{
MPI_Init( &argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
MPI_Comm_size(MPI_COMM_WORLD,&groupsize);
omp_set_num_threads(4);
sum = 0;
#pragma omp for reduction(+:sum)
for (int i = 0; i < n; i++)
sum+= i/(n/10);
cout<<"sum="<<sum<<endl;
cout<<"threads="<<omp_get_num_threads()<<endl;
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该方案产出:
sum = 4.5e+007
threads=1
Run Code Online (Sandbox Code Playgroud)
如何控制线程数?
我遇到了一个具有崩溃条款的OpenMP代码,这对我来说是新的.我试图理解这意味着什么,但我认为我没有完全理解它的含义; 我发现的一个定义是:
COLLAPSE:指定嵌套循环中应将多少循环折叠到一个大的迭代空间中,并根据schedule子句进行划分.在所有关联循环中顺序执行迭代确定了折叠迭代空间中迭代的顺序.
我以为我理解了这意味着什么,所以我尝试了以下简单的程序:
int i, j;
#pragma omp parallel for num_threads(2) private(j)
for (i = 0; i < 4; i++)
for (j = 0; j <= i; j++)
printf("%d %d %d\n", i, j, omp_get_thread_num());
Run Code Online (Sandbox Code Playgroud)
哪个产生了
0 0 0
1 0 0
1 1 0
2 0 0
2 1 0
2 2 1
3 0 1
3 1 1
3 2 1
3 3 1
Run Code Online (Sandbox Code Playgroud)
然后我添加了该collapse(2)条款.我希望在前两列中得到相同的结果,但现在在最后一列中有相同数量的0's 1' 和's'.但是我得到了
0 0 0
1 0 …Run Code Online (Sandbox Code Playgroud) 我正在运行一个摄像头采集程序,对采集的图像进行处理,我正在使用简单的OpenMP指令进行处理.所以基本上我等待来自相机的图像,然后处理它.
迁移到VC2010时,我看到了非常奇怪的性能问题:在VC2010下,我的应用程序占用了近100%的CPU,而在VC2008下只占用了10%.
如果我只对处理代码进行基准测试,那么VC2010和VC2008之间没有区别,使用采集功能会产生差异.
我已经将重现问题所需的代码减少到一个简单的循环,执行以下操作:
for (int i=0; i<1000; ++i)
{
GetImage(buffer);//wait for image
Copy2Array(buffer, my_array);
long long sum = 0;//do some simple OpenMP parallel loop
#pragma omp parallel for reduction(+:sum)
for (int j=0; j<size; ++j)
sum += my_array[j];
}
Run Code Online (Sandbox Code Playgroud)
这个循环占2008年CPU的5%,2010年占70%.
我做了一些分析,这表明在2010年大部分时间花在了OpenMP上 vcomp100.dll!_vcomp::PartialBarrierN::Block
我还做了一些并发性分析:
在2008年,处理工作分布在3个工作线程上,由于处理时间远远低于图像等待时间,所以它们非常活跃
相同的线程出现在2010年,但它们都被该PartialBarrierN::Block功能100%占用.由于我有四个核心,他们正在吃75%的工作,这大致是我在CPU职业中看到的.
所以看起来OpenMP和Matrox采集库(专有)之间存在冲突.但它是VS2010或Matrox的错误吗?有什么我能做的吗?使用VC++ 2010对我来说是必须的,所以我不能坚持使用2008.
十分感谢
正如DeadMG所建议的那样,使用新的并发框架会导致40%的CPU.分析它显示时间花在处理上,因此它没有显示我在OpenMP中看到的错误,但在我的情况下性能比OpenMP差.
我已经安装了最新英特尔C++的评估版.它显示完全相同的性能问题!!
我交叉发布到MSDN论坛
在Windows 7 64位和XP 32位上测试,结果完全相同(在相同的机器上)
让我们说有一台4个CPU的计算机,每个CPU有2个核心,所以共有8个核心.由于我的理解有限,我认为在这种情况下所有处理器共享相同的内存.现在,最好直接使用openMP或使用MPI使其通用,以便代码可以在分布式和共享设置上工作.另外,如果我将MPI用于共享设置,那么与openMP相比性能会降低吗?
我们最近启用-Wall了一个项目.当GCC处于4.7或更高(或Clang)时启用它,因为我们可以GCC diagnostic用来管理提升警告的输出.我们希望从源代码管理它们,而不是通过命令行参数.(我们不想污染命令行,或者要求库用户重新发现需要的内容).
下GCC 4.8和5.1,我们正在捕捉的用于GCC诊断块中禁用的警告-Wunused-variable,-Wunused-value,-Wunused-function和-Wunknown-pragmas.两个GCC都接受-fopenmp,并且都定义_OPENMP为响应它,所以我相当肯定它我们永远不应该看到-Wunknown-pragmas响应#prgam omp ...(它被禁用,但它不是未知).
g++ -DNDEBUG -g2 -O3 -Wall -march=native -pipe -c nbtheory.cpp
nbtheory.cpp:655:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]
#pragma omp parallel
^
nbtheory.cpp:656:0: warning: ignoring #pragma omp sections [-Wunknown-pragmas]
#pragma omp sections
^
...
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,文件nbtheroy.cpp具有以下保护措施以帮助管理该警告(仅显示相关部分,但您可以从GitHub链接中查看所有内容):
// Defines GCC_DIAGNOSTIC_AWARE if GCC 4.7 or above.
#include <misc.h> …Run Code Online (Sandbox Code Playgroud) 我很好奇,如果两个线程同时请求分配内存,是否存在内存分配锁定.我正在使用OpenMP来执行多线程,C++代码.
操作系统:主要是Linux,但也想了解Windows和Mac.
我一直在网上搜索,但我仍然对此话题感到困惑.谁能更清楚地解释这个?我来自航空航天工程背景(不是计算机科学专业),所以当我在网上阅读有关OpenMP/CUDA等的内容时.和多线程我真的不太了解所说的很多内容.
我目前正在尝试并行化用FORTRAN编写的内部CFD软件.这些是我的疑惑:
OpenMP使用来自CPU的多个线程共享工作负载.它可以用来让GPU也能完成一些工作吗?
我读过OpenACC.它是否类似于OpenMP(易于使用)?
我也读过有关CUDA和内核的内容,但我对并行编程没有太多经验,而且我对内核的内容并不了解.
你能给我一个"傻瓜"类型的答案吗?
如何让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)
任何推荐的工作?