Tag: openmp

前缀和的并行化(Openmp)

我有两个向量,a [n]和b [n​​],其中n是一个大数。 a[0] = b[0]; for (i = 1; i < size; i++) { a[i] = a[i-1] + b[i]; } 使用此代码,我们尝试实现a [i]包含b []中所有数字的总和,直到b [i]。 我需要使用openmp并行化这个循环。 主要的问题是a [i]取决于[i-1],因此我想到的唯一直接方法是等待每个[i-1]数字准备就绪,这需要花费大量时间并没有任何意义。 openmp中是否有任何方法可以解决这个问题?

multithreading可以抑制编译器优化吗?

我偶然发现有几次将部分程序与OpenMP并行化只是为了注意到最后,尽管具有良好的可扩展性,但由于单线程情况的性能不佳,大多数预见的加速都会丢失(如果与串行版)。 网络上出现的这种行为的常见解释是编译器生成的代码在multithreading情况下可能更糟 。 无论如何,我无法在任何地方找到解释为什么assembly可能更糟的参考。 那么,我想问一下编译器的人是: multithreading可以抑制编译器优化吗? 万一,性能怎么会受到影响? 如果它可以帮助缩小问题,我主要对高性能计算感兴趣。 免责声明 :正如评论中所述,以下部分答案可能在将来过时,因为他们简要讨论了在提出问题时编译器处理优化的方式。

openmp – 用于文本文件读取和使用管道的while循环

我发现openmp不支持while循环(或者至少不太喜欢它们)。 而且也不喜欢’!=’运算符。 我有这段代码。 int count = 1; #pragma omp parallel for while ( fgets(buff, BUFF_SIZE, f) != NULL ) { len = strlen(buff); int sequence_counter = segment_read(buff,len,count); if (sequence_counter == 1) { count_of_reads++; printf(“\n Total No. of reads: %d \n”,count_of_reads); } count++; } 关于如何管理这个的任何线索? 我在某地读过(包括stackoverflow的另一篇文章)我可以使用管道。 那是什么 ? 以及如何实施它?

如何以一种很好的方式禁用OpenMP指令?

我有内置OpenMP pragma的C ++代码。 我想测试这个代码的multithreading模式(使用OpenMP)和单线程模式(没有OpenMP)。 现在,要在模式之间切换,我需要注释#pragma omp (或者至少是parallel )。 启用/禁用OpenMP的最简洁或最默认的方法是什么?

OpenMP性能

首先,我知道经常会问这种[类型]问题,所以让我先说一下我尽可能多地阅读,但我仍然不知道这笔交易是什么。 我已经并行化了一个巨大的外部for循环。 循环迭代的次数变化,通常在20到150之间,但是循环体做了大量的工作,调用了许多本地密集线性代数例程(如,代码是源的一部分,而不是外部依赖) 。 在循环体内有1000多个这些例程的调用,但它们都是完全独立的,所以我认为它将是并行性的主要候选者。 循环代码是C ++,但它调用很多用C编写的子程序。 代码看起来像这样; #ifdef _OPENMP #pragma omp parallel for \ private(….)\ shared(….) \ firstprivate(….) schedule(runtime) #endif for(tst = 0; tst < ntest; tst++) { // Lots of functionality (science!) // Calls to other deep functions which manipulate private variables only // Call to function which has 1000 loop iterations doing […]

openmp是否会分配内存并释放所有内容

openmp是否分配内存并释放所有内存? 因为我跑了valgrind,并且释放了我所有的名单..我在malloc的所有东西,我都自由了。 ==11442== HEAP SUMMARY: ==11442== in use at exit: 192 bytes in 1 blocks ==11442== total heap usage: 2,001 allocs, 2,000 frees, 2,917,280 bytes allocated ==11442== ==11442== LEAK SUMMARY: ==11442== definitely lost: 0 bytes in 0 blocks ==11442== indirectly lost: 0 bytes in 0 blocks ==11442== possibly lost: 0 bytes in 0 blocks ==11442== […]

什么时候需要减少?

我写了这个代码,它读取矩阵,它基本上总结了矩阵的值…但我的问题是,因为我尝试以不同的方式做pragma,我发现reduction (+:sum)没有必要,但是,我只是不知道为什么,在这种情况下,我可能已经错过了减少系统的实际意义。 这将是另一种选择: #pragma omp parallel for private(i, j) reduction (+:sum) 这将是代码: #include #include #include #include int main () { printf(“===MATRIX SUM===\n”); printf(“N ROWS: “); int i1; scanf(“%d”,&i1); printf(“M COLUMNS: “); int j1; scanf(“%d”,&j1); int matrixA[i1][j1]; int i, j; for(i = 0; i < i1; i++){ for (j = 0; j < j1; j++){ scanf("%d",&matriuA[i][j]); […]

并行计算 – 输出混乱?

我正在尝试学习并行计算的基础知识,但我在计算机上遇到了一个问题。 看看下面的代码。 基本上,我想打印出“Hello World!”这一行。 我的电脑拥有的每一个核心。 我的电脑有四个核心,因此它应打印出该行四次。 如果我使用已注释掉的’cout’行而不是’printf’行,输出将全部混乱。 这是因为’\ n’转义命令与“Hello World!”分开执行,因此新行输出将随机发生。 ‘printf’行是这个问题的解决方案,因为该行是一次性执行的(不会分成像’cout’行这样的部分)。 但是,当我使用’printf’时,我的输出仍然混乱,就像我使用’cout’一样。 我不知道为什么会这样做。 我在另一台计算机上尝试了完全相同的代码,它完美无缺。 只有我的电脑继续使用’printf’混淆输出。 我已经通过电子邮件向我的CS教授发了电子邮件,他不知道为什么要在我的电脑上这样做。 我知道我在计算机上正确设置了OpenMP。 有并行计算经验的人是否知道为什么这会弄乱我的电脑? #include #include #include #include using namespace std; int main() { #pragma omp parallel { printf(“Hello World!\n”); //cout << "Hello World!\n" << endl; } return 0; } 为了显示我正在谈论的内容,这是我在计算机上运行上述代码时的输出: 你好禾 你好,世界! RLD! 你好,世界!

将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 当我使用gcc时,一切正常: gcc test.c -o test -fopenmp 我也试过运行export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5.1.1:$LD_LIBRARY_PATH但它没有帮助。 ` 有什么建议?

有条件的“pragma omp”

我正在尝试使用OpenMP进行不同类型的并行化。 结果我在我的代码中有几行#pragma omp parallel for ,我(un-)评论交替。 有没有办法使这些行有条件的类似下面的东西,而不是工作代码? define OMPflag 1 #if OMPFlag pragma omp parallel for for …