标签: openmp

是否可以使用openmp对数组进行减少?

OpenMP本身是否支持减少表示数组的变量?

这可能会像以下一样......

float* a = (float*) calloc(4*sizeof(float));
omp_set_num_threads(13);
#pragma omp parallel reduction(+:a)
for(i=0;i<4;i++){
   a[i] += 1;  // Thread-local copy of a incremented by something interesting
}
// a now contains [13 13 13 13]
Run Code Online (Sandbox Code Playgroud)

理想情况下,对于omp并行会有类似的东西,并且如果你有足够多的线程使它有意义,那么积累将通过二叉树发生.

c++ arrays openmp reduction

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

编写std :: vector vs plain数组的线程安全性

我已经在Stackoverflow上读到,没有一个STL容器对于写入是线程安全的.但这在实践中意味着什么?这是否意味着我应该将可写数据存储在普通数组中?

我希望并发调用std::vector::push_back(element)可能会导致数据结构不一致,因为它可能需要调整向量的大小.但是这样的情况呢,不涉及调整大小:

1)使用数组:

int data[n];
// initialize values here...

#pragma omp parallel for
for (int i = 0; i < n; ++i) {
    data[i] += func(i);
}
Run Code Online (Sandbox Code Playgroud)

2)使用`std :: vector``:

std::vector<int> data;
data.resize(n);
// initialize values here...

#pragma omp parallel for
for (int i = 0; i < n; ++i) {
    data[i] += func(i);
}
Run Code Online (Sandbox Code Playgroud)

第一个实现是否真的比第二个更好a)在线程安全方面和b)在性能方面?我更喜欢使用std :: vector,因为我对C风格的数组不太熟悉.

编辑:我删除了#pragma omp atomic update保护写.

c++ stl openmp thread-safety

19
推荐指数
2
解决办法
9067
查看次数

如何在OS X中包含omp.h?

我是C的新手,在OS X中编译代码时遇到了一些问题.

我在Eclipse中编写了很多Java代码,并使用终端编译我的代码.但是现在我正在学习openMP并且遇到麻烦.

首先我下载了​​Xcode来编写openMP代码,但它无法识别<omp.h>.然后我安装了g++.当我输入g++ -v终端时,我得到了这个:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

但是当我使用时,g++ Mesh.cpp -fopenmp我仍然会得到

Mesh.cpp:4:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

然后我尝试将PTP安装到Eclipse中并遇到同样的问题.我以为omp.h我的MacBook 中没有,所以我搜索了它,发现下面有几个omp.h文件夹gcc-4.9.1/build/.

这就是问题所在.根据Java经验,我拥有该文件但无法使用它的唯一原因是类路径错误.但是,我不知道如何在g ++,Xcode或Eclipse中更改此配置.但是因为我可以包含<stdio.h>所有IDE的文件并使用所有IDE编译它,我怎么能不这样做<omp.h>呢?

我注意到的另一件事是gcc文件夹版本是4.9.1,但当我输入gcc -v终端时,我输入相同的内容g++ -v

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on …
Run Code Online (Sandbox Code Playgroud)

c++ gcc g++ openmp

19
推荐指数
5
解决办法
5万
查看次数

没有multilib的gcc是什么意思?

我试图使用omh.h头文件,我意识到它丢失了.我尝试使用brew在我的mac上重新安装gcc.这是我在安装结束时收到的消息.

..
GCC has been built with multilib support. Notably, OpenMP may not work:
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60670
If you need OpenMP support you may want to
  brew reinstall gcc --without-multilib
==> Summary
  /usr/local/Cellar/gcc/4.9.2_1: 1156 files, 203M
Run Code Online (Sandbox Code Playgroud)

它表明,如果我需要OpenMP支持,我需要安装brew reinstall gcc --without-multilib.我无法理解其含义--without-multilib.它与简单地安装gcc有什么不同?

并且显然brew reinstall gcc --without-multilib需要永远运行并且brew uninstall gcc && brew install gcc闪电般快速.

macos gcc g++ openmp

19
推荐指数
1
解决办法
9984
查看次数

超线程...使我的渲染器慢了10倍

执行摘要:如何在代码中指定OpenMP应该只为REAL内核使用线程,即不计算超线程的线程?

详细分析:多年来,我在空闲时间编写了一个仅限SW的开源渲染器(光栅化器/光线跟踪器).可以从这里获得GPL代码和Windows二进制文件:https: //www.thanassis.space/renderer.html 它在Windows,Linux,OS/X和BSD下编译并运行良好.

我上个月推出了一种光线追踪模式 - 生成的图片质量飙升.不幸的是,光线跟踪比光栅化要慢几个数量级.为了提高速度,就像我对光栅化器一样,我为光线跟踪器添加了OpenMP(和TBB)支持 - 以便轻松利用额外的CPU内核.光栅化和光线跟踪都很容易进行线程化(每个三角形工作 - 每像素工作).

在家里,凭借我的Core2Duo,第二核心帮助了所有模式 - 光栅化和光线跟踪模式的加速都在1.85x和1.9x之间.

问题:当然,我很想看到CPU的最高性能(我也玩"GPU",初步的CUDA端口),所以我想要一个坚实的基础进行比较.我把代码交给了我的一个好朋友,他可以使用16英寸,1500美元英特尔超级处理器的"野兽"机器.

他以"最重"模式运行它,光线跟踪模式......

......他的速度是我的Core2Duo的五分之一(!)

喘气 - 恐怖.刚刚发生了什么?

我们开始尝试不同的修改,补丁,......最终我们弄明白了.

通过使用OMP_NUM_THREADS环境变量,可以控制生成的OpenMP线程数.随着线程数从1增加到8,速度增加(接近线性增加).在我们越过8的那一刻,速度开始减弱,直到我的Core2Duo速度的五分之一,当使用所有16​​个核心时!

为什么8?

因为8是真实核心的数量.其他8个是...超线程的!

理论:现在,这对我来说是新闻 - 我看到超线程在其他算法中帮助很多(高达25%),所以这是出乎意料的.显然,即使每个超线程核心都有自己的寄存器(和SSE单元?),光线跟踪器也无法利用额外的处理能力.这引导我思考......

它可能不是缺乏处理能力 - 它是内存带宽.

光线跟踪器使用边界体积层次结构数据结构来加速光线三角形交叉.如果使用的芯超线程,则每个在一对"逻辑核"的,试图从在该数据结构不同的地方(即,在存储器中),以读 - 和CPU高速缓存(每对本地)完全捶打.至少,这是我的理论 - 任何建议都是最受欢迎的.

所以,问题是: OpenMP检测"核心"的数量并产生与之匹配的线程 - 也就是说,它包括计算中的超线程"核心".就我而言,这显然会导致灾难性的结果,速度方面.有谁知道如何使用OpenMP API(如果可能的话,可移植)只为REAL内核生成线程,而不是超线程的线程?

PS代码是开放的(GPL),可在上面的链接中找到,随时可以在您自己的机器上重现 - 我猜这将在所有超线程CPU中发生.

PPS原谅帖子的长度,我认为这是一种教育经历,想分享.

rendering renderer openmp hyperthreading slowdown

18
推荐指数
1
解决办法
3993
查看次数

在OpenMP并行代码中,memset并行运行会有什么好处吗?

我的内存块可能非常大(比L2缓存大),有时我必须将它们设置为全零.memset在串行代码中很好,但是并行代码呢?如果从并发线程调用memset实际上加快了大型数组的速度,有经验吗?或者甚至使用简单的openmp并行for循环?

c performance openmp

18
推荐指数
1
解决办法
2234
查看次数

omp ordered子句如何工作?

vector<int> v;

#pragma omp parallel for ordered schedule(dynamic, anyChunkSizeGreaterThan1)
    for (int i = 0; i < n; ++i){
            ...
            ...
            ...
#pragma omp ordered
            v.push_back(i);
    }
Run Code Online (Sandbox Code Playgroud)

这将填充v一个n大小有序的列表.

当到达omp ordered块时,所有线程都需要等待最低迭代可能线程完成,但是如果没有任何线程被指定为特定迭代怎么办?或者OpenMP运行时库是否始终确保某个线程处理最低的迭代?

另外为什么建议该ordered条款与dynamic schedule?一起使用?会static schedule影响表现吗?

c++ parallel-processing openmp

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

不能超过50%.矩阵乘法的理论性能

问题

我正在学习HPC和代码优化.我试图在Goto的开创性矩阵乘法论文(http://www.cs.utexas.edu/users/pingali/CS378/2008sp/papers/gotoPaper.pdf)中复制结果.尽管我付出了最大努力,但我无法超过理论CPU最高性能的50%.

背景

请参阅此处的相关问题(优化的2x2矩阵乘法:慢速装配与快速SIMD),包括有关我的硬件的信息

我尝试过的

这篇相关论文(http://www.cs.utexas.edu/users/flame/pubs/blis3_ipdps14.pdf)很好地描述了Goto的算法结构.我在下面提供了我的源代码.

我的问题

我要求一般帮助.我一直在研究这个问题太久了,已经尝试了很多不同的算法,内联汇编,各种尺寸的内核(2x2,4x4,2x8,...,mxn m和n大),但我似乎无法打破50%CPU Gflops.这纯粹是出于教育目的,而不是作业.

源代码

希望是可以理解的.如果没有请问.我设置了宏结构(for循环),如上面第2篇文章中所述.我按照两篇论文中的讨论打包矩阵,并在图11中以图形方式显示(http://www.cs.utexas.edu/users/flame/pubs/BLISTOMSrev2.pdf).我的内核计算2x8块,因为这似乎是Nehalem架构的最佳计算(参见GotoBLAS源代码 - 内核).内核基于计算排名1更新的概念,如此处所述(http://code.google.com/p/blis/source/browse/config/template/kernels/3/bli_gemm_opt_mxn.c)

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <x86intrin.h>
#include <math.h>
#include <omp.h>
#include <stdint.h>


// define some prefetch functions
#define PREFETCHNTA(addr,nrOfBytesAhead) \
        _mm_prefetch(((char *)(addr))+nrOfBytesAhead,_MM_HINT_NTA)

#define PREFETCHT0(addr,nrOfBytesAhead) \
        _mm_prefetch(((char *)(addr))+nrOfBytesAhead,_MM_HINT_T0)

#define PREFETCHT1(addr,nrOfBytesAhead) \
        _mm_prefetch(((char *)(addr))+nrOfBytesAhead,_MM_HINT_T1)

#define PREFETCHT2(addr,nrOfBytesAhead) \
        _mm_prefetch(((char *)(addr))+nrOfBytesAhead,_MM_HINT_T2)

// define a min function
#ifndef min
    #define min( a, b ) ( …
Run Code Online (Sandbox Code Playgroud)

c optimization sse matrix openmp

18
推荐指数
1
解决办法
698
查看次数

将OpenMP与clang一起使用

我在使用clang(3.6和3.8 ToT)编译OpenMP代码时遇到问题.

我关注了这篇博文http://blog.llvm.org/2015/05/openmp-support_22.html,但问题是编译的程序只在一个线程上执行.我正在使用ubuntu 15.04 x64,我安装了libgomp和libiopmp,并使用以下命令编译我的代码:

clang test.c -o test -fopenmp -L/usr/lib/gcc/x86_64-linux-gnu/5.1.1
Run Code Online (Sandbox Code Playgroud)

当我使用gcc代替时,一切正常: gcc test.c -o test -fopenmp

我也试过跑,export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5.1.1:$LD_LIBRARY_PATH但没有帮助.`

有什么建议?

c c++ openmp clang

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

OpenMp编码:警告:忽略#pragma omp parallel

我在使用Linux上的OpenMP指令编译C代码时收到此警告:

warning: ignoring #pragma omp parallel
Run Code Online (Sandbox Code Playgroud)

Gcc版本是4.4.

这只是一个我不应该关心的警告吗?执行是否会并行?我想要一个有一些解释的解决方案.

我已经提供-fopenmpmake命令,但是gcc不接受,否则对于单个文件编译,即gcc -fopenmp工作正常.

warnings openmp

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