标签: openmp

用于最小值,最大值,中值,平均值的OpenMp C++算法

我在谷歌搜索提供一些简单的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)

但是当这些算法不可用时,几乎没有留下用于减少算法的例子.

c++ algorithm multithreading openmp

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

用C++ OpenMP代码测量执行时间

我正在以顺序方式运行.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++ parallel-processing time openmp

27
推荐指数
4
解决办法
3万
查看次数

OpenMP set_num_threads()不起作用

我正在使用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)

如何控制线程数?

c++ multithreading numbers set openmp

27
推荐指数
3
解决办法
12万
查看次数

理解openmp中的collapse子句

我遇到了一个具有崩溃条款的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)

c openmp

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

OpenMP:Visual C++ 2008和2010之间的巨大性能差异

我正在运行一个摄像头采集程序,对采集的图像进行处理,我正在使用简单的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差.

状态更新2

我已经安装了最新英特尔C++的评估版.它显示完全相同的性能问题!!

我交叉发布到MSDN论坛

状态更新3

在Windows 7 64位和XP 32位上测试,结果完全相同(在相同的机器上)

c++ performance openmp visual-studio-2010

25
推荐指数
2
解决办法
8726
查看次数

MPI与openMP共享内存

让我们说有一台4个CPU的计算机,每个CPU有2个核心,所以共有8个核心.由于我的理解有限,我认为在这种情况下所有处理器共享相同的内存.现在,最好直接使用openMP或使用MPI使其通用,以便代码可以在分布式和共享设置上工作.另外,如果我将MPI用于共享设置,那么与openMP相比性能会降低吗?

mpi openmp shared-memory

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

海湾合作委员会不尊重'pragma GCC诊断'来消除警告

我们最近启用-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)

c++ gcc pragma openmp compiler-warnings

25
推荐指数
1
解决办法
7645
查看次数

在多线程C/C++中,malloc/new在分配内存时会锁定堆

我很好奇,如果两个线程同时请求分配内存,是否存在内存分配锁定.我正在使用OpenMP来执行多线程,C++代码.

操作系统:主要是Linux,但也想了解Windows和Mac.

c++ malloc multithreading openmp

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

OpenMP可以用于GPU吗?

我一直在网上搜索,但我仍然对此话题感到困惑.谁能更清楚地解释这个?我来自航空航天工程背景(不是计算机科学专业),所以当我在网上阅读有关OpenMP/CUDA等的内容时.和多线程我真的不太了解所说的很多内容.

我目前正在尝试并行化用FORTRAN编写的内部CFD软件.这些是我的疑惑:

  1. OpenMP使用来自CPU的多个线程共享工作负载.它可以用来让GPU也能完成一些工作吗?

  2. 我读过OpenACC.它是否类似于OpenMP(易于使用)?

我也读过有关CUDA和内核的内容,但我对并行编程没有太多经验,而且我对内核的内容并不了解.

  1. 对于FORTRAN,是否有一种简单易用的方式与GPU共享我的工作负载(如果OpenMP不这样做而OpenACC不可移植)?

你能给我一个"傻瓜"类型的答案吗?

multithreading fortran gpu openmp openacc

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

在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万
查看次数