Tag: openmp

Openmp嵌套循环

只是玩弄openmp。 看看这段代码片段: #pragma omp parallel { for( i =0;i<n;i++) { doing something } } 和 for( i =0;i<n;i++) { #pragma omp parallel { doing something } } 为什么第一个比第二个慢得多(大约5倍)? 从理论上我认为第一个必须更快,因为并行区域只创建一次而不是像第二次那样n次? 谁可以给我解释一下这个? 我想要并行化的代码具有以下结构: for(i=0;i<n;i++) //wont be parallelizable { for(j=i+1;j<n;j++) //will be parallelized { doing sth. } for(j=i+1;j<n;j++) //will be parallelized for(k = i+1;k<n;k++) { doing sth. } […]

-fopenmp提供了什么预处理器定义?

我有一些可以运行(或不运行)OpenMP的代码 – 它取决于用户如何设置makefile。 如果他们想要使用OpenMP运行,那么他们只需将-fopenmp添加到CFLAGS和CXXFLAGS 。 我正在尝试确定在-fopenmp生效时我可以用什么预处理器宏来判断。 omp.h标头看起来不是很有趣: $ cat /usr/lib/gcc/x86_64-linux-gnu/4.8/include/omp.h | grep define #define OMP_H 1 #define _LIBGOMP_OMP_LOCK_DEFINED 1 # define __GOMP_NOTHROW throw () # define __GOMP_NOTHROW __attribute__((__nothrow__)) 我无法让预处理器提供任何有用的东西: $ cpp -dM -fopenmp </dev/null | grep -i omp #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 #define __STDC_IEC_559_COMPLEX__ 1 $ cpp […]

OpenMP中的并行合并排序

我在本文中看到了并行合并排序的算法。 这是代码: void mergesort_parallel_omp (int a[], int size, int temp[], int threads) { if ( threads == 1) { mergesort_serial(a, size, temp); } else if (threads > 1) { #pragma omp parallel sections { #pragma omp section mergesort_parallel_omp(a, size/2, temp, threads/2); #pragma omp section mergesort_parallel_omp(a + size/2, size – size/2, temp + size/2, threads – […]

当我使用并行代码时,为什么我的计算机没有显示加速?

所以我意识到这个问题听起来很愚蠢(是的,我使用的是双核),但是我尝试了两个不同的库(Grand Central Dispatch和OpenMP),并且在使用clock()时使用和不使用的行来计时代码它平行,速度是一样的。 (为了记录,他们都使用自己的平行forms)。 他们报告说是在不同的线程上运行,但也许它们运行在同一个核心上? 有没有办法检查? (两个库都用于C,我在较低层时感到不舒服。)这非常奇怪。 有任何想法吗?

Openmp基本并行化

我已经陷入了使用OpenMP编写一些并行c代码以进行并发过程的困难。 这是一个片段 #include #include #include #define FALSE 0 #define TRUE 1 int count_primes_0(int); int count_primes_1(int); int count_primes_2(int); int main(int argc, char *argv[]){ int n; if (argc != 2){ printf(“Incorrect Invocation, use: \nq1 N”); return 0; } else { n = atoi(argv[1]); } if (n < 0){ printf("N cannot be negative"); return 0; } printf("N = […]

OpenMP和GSL RNG – 性能问题 – 4个线程实现比纯序列1(四核CPU)慢10倍

我正在尝试将我的C项目从顺序编程转换为并行编程。 尽管大多数代码现在已经从头开始重新设计,但随机数的生成仍然是其核心。 因此,随机数发生器(RNG)的不良性能会严重影响程序的整体性能。 我写了一些代码行(见下文),以显示我面临的问题而没有太多冗长。 问题如下:每次线程数增加时,性能都会明显变差。 在这个工作站(linux内核2.6.33.4; gcc 4.4.4; intel四核CPU)中,无论迭代次数n多少,并行for循环使用nt = 4比使用nt = 1大约长10倍。 这种情况似乎在这里描述,但焦点主要集中在fortran,一种我不太了解的语言,所以我非常感谢一些帮助。 我试图按照他们的想法创建不同的RNG(使用不同的种子)来访问每个线程,但性能仍然很差。 实际上,每个线程的这个不同的播种点也让我感到困惑,因为我无法看到最终如何保证生成的数字的质量(缺乏相关性等)。 我已经考虑过完全放弃GSL并自己实现一个随机生成器算法(例如Mersenne-Twister),但我怀疑我稍后会遇到同样的问题。 非常感谢您的回答和建议。 请问我可能忘记提及的任何重要事项。 编辑:由lucas1024(pragma for-loop声明)和JonathanDursi(播种;将“a”设置为私有变量)建议的更正。 multithreading模式下的性能仍然非常低迷。 编辑2: Jonathan Dursi建议的实施解决方案(见评论)。 #include #include #include #include #include double d_t (struct timespec t1, struct timespec t2){ return (t2.tv_sec-t1.tv_sec)+(double)(t2.tv_nsec-t1.tv_nsec)/1000000000.0; } int main (int argc, char *argv[]){ double a, b; int i,j,k; int n=atoi(argv[1]), seed=atoi(argv[2]), […]

作为OpenMP pragma的结果的中间代码

有没有办法获得OpenMP pragma生成的中间源代码? 我想看看每种pragma是如何翻译的。 干杯。

嵌套循环,内循环并行化,重用线程

免责声明:以下示例只是一个快速了解问题的虚拟示例。 如果您正在考虑现实问题,请考虑任何动态编程。 问题:我们有一个n * m矩阵,我们想要复制上一行中的元素,如下面的代码所示: for (i = 1; i < n; i++) for (j = 0; j < m; j++) x[i][j] = x[i-1][j]; 方法:必须按顺序执行外循环迭代,它们将按顺序执行。 内环可以并行化。 我们希望最小化创建和杀死线程的开销,因此我们只想创建一次线程团队,但是,这似乎是OpenMP中不可能完成的任务。 #pragma omp parallel private(j) { for (i = 1; i < n; i++) { #pragma omp for scheduled(dynamic) for (j = 0; j < m; j++) x[i][j] = […]

OpenMP库规范

我是新手打开mp,我尝试从官方网站上的示例程序 #include #include int main() { #pragma omp parallel printf(“Hello from thread %d, nthreads %d\n”, omp_get_thread_num(), omp_get_num_threads()); } 我已经在eclipse中将库设置为项目属性 – > GCC c ++链接器中的libgomp- 但程序说/usr/bin/ld: cannot find -llibgomp我能知道我哪里错了

为什么POSIX线程比OpenMP慢

我在带有Xeon处理器的Mac Pro上运行完全并行的矩阵乘法程序。 我创建了8个线程(与核心一样多的线程),并且没有共享写入问题(没有写入相同的位置)。 出于某种原因,我使用pthread_create和pthread_join速度大约是使用#pragma openmp两倍。 在任何事情上没有其他差异……相同的编译选项,两种情况下相同的线程数,相同的代码(显然除了pragma / pthread部分)等。 循环非常大 – 我没有并行化小循环。 (我不能真正发布代码,因为它是学校的工作。) 为什么会发生这种情况? OpenMP不使用POSIX线程吗? 怎么会更快?