Tag: openmp

为什么我的OpenMP实现比单线程实现慢?

我正在学习OpenMP并发性,并尝试了我现有的一些代码。 在这段代码中,我尝试将所有for循环并行化。 但是,这似乎使程序变得更慢,比单线程版本慢至少10倍,甚至更多。 这是代码: http : //pastebin.com/zyLzuWU2 我还使用了pthreads,它比单线程版本更快。 现在的问题是,在我的OpenMP实现中我做错了什么导致了这种放缓? 谢谢! 编辑:单线程版本只是没有所有#pragmas的版本

为什么以下的OpenMP程序无法减少我的变量?

考虑以下最小C代码示例。 当使用export OMP_NUM_THREADS=4 && gcc -fopenmp minimal.c && ./a.out 8上的GCC 4.9.2)进行编译和执行时,这会在我的机器上生成五行rho=100 (有时也是200或400) 。 对于所有五条印刷线,预期输出当然是rho=400 。 如果我在// MARKER处插入更多代码或在那里放置障碍,该程序更有可能产生正确的结果。 但即使有另一个障碍,它有时会失败,我的计划也会失败。 所以问题似乎是在进入减少循环时a没有正确初始化。 OpenMP 4.0.0手册甚至在第55页上指出, 除非指定了nowait子句,否则在循环结构的末尾有一个隐式屏障。 所以应该在这一点上建立一个。 这里出了什么问题? 我错过了什么吗? #include #ifdef _OPENMP #include #define ID omp_get_thread_num() #else #define ID 0 #endif double a[100]; int main(int argc, char *argv[]) { int i; double rho; #pragma omp parallel { #pragma omp […]

使用OpenMP计算PI的值

我正在尝试通过并行化monte carlo代码来学习如何使用OpenMP,该代码使用给定的迭代次数来计算PI的值。 代码的内容是这样的: int chunk = CHUNKSIZE; count=0; #pragma omp parallel shared(chunk,count) private(i) { #pragma omp for schedule(dynamic,chunk) for ( i=0; i<niter; i++) { x = (double)rand()/RAND_MAX; y = (double)rand()/RAND_MAX; z = x*x+y*y; if (z<=1) count++; } } pi=(double)count/niter*4; printf("# of trials= %d , estimate of pi is %g \n",niter,pi); 虽然在10,000次迭代时,这并没有产生适当的pi值。 如果取出所有OpenMP东西,它就可以正常工作。 我应该提一下,我使用了monte carlo代码: http […]

在OpenMP中为每个内部循环启动一个线程

我是OpenMP的新手,我正在尝试启动一个单独的线程来处理2D数组中的每个项目。 基本上,这个: for (i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { a[i][j] = b[i][j] + c[i][j]; 我正在做的是这样的: #pragma omp parallel for shared(a,b,c) private(i,j) reduction(+:diff) schedule(dynamic) for (i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { a[i][j] […]

OpenMP和C并行for循环:为什么我的代码在使用OpenMP时会变慢?

我是新来的,是C语言的初级程序员。我在使用openmp来加速for循环方面遇到了一些问题。 以下是简单的例子: #include #include #include #include gsl_rng *rng; main() { int i, M=100000000; double tmp; /* initialize RNG */ gsl_rng_env_setup(); rng = gsl_rng_alloc (gsl_rng_taus); gsl_rng_set (rng,(unsigned long int)791526599); // option 1: parallel #pragma omp parallel for default(shared) private( i, tmp ) schedule(dynamic) for(i=0;i<=M-1;i++){ tmp=gsl_ran_gamma_mt(rng, 4, 1./3 ); } // option 2: sequential for(i=0;i<=M-1;i++){ tmp=gsl_ran_gamma_mt(rng, 4, […]

C OpenMP并行冒泡排序

我在C中使用OpenMP实现了并行冒泡排序算法( Odd-Even转置排序 )。 然而,在我测试它之后,它比串行版本慢了(大约10%),尽管我有一个4核处理器(2个真正的x 2,因为英特尔超线程)。 我已经检查过核心是否实际使用过,我可以在运行程序时以100%的比例看到它们。 因此我认为我在实现算法时犯了一个错误。 我使用linux与内核2.6.38-8-generic。 这是我编译的方式: gcc -o bubble-sort bubble-sort.c -Wall -fopenmp或 gcc -o bubble-sort bubble-sort.c -Wall -fopenmp用于串行版本 这就是我的运行方式: ./bubble-sort out_10000 #include #include #include #include int main() { int i, n, tmp, *x, changes; int chunk; scanf(“%d “, &n); chunk = n / 4; x = (int*) malloc(n * sizeof(int)); for(i = […]

OpenMP导致heisenbug段错误

我正在尝试在OpenMP中并行化一个相当大的for-loop 。 大约20%的时间它运行良好,但其余的时间它崩溃与各种段错误,如; *** glibc detected *** ./execute: double free or corruption (!prev): *** *** glibc detected *** ./execute: free(): invalid next size (fast): *** [2] segmentation fault ./execute 我的一般代码结构如下; #pragma omp parallel private(list of private variables which are initialized in for loop) shared(much shorter list of shared variables) { #pragma omp for for (index […]

OpenMP – 用于循环线程分配

假设我有一个索引为0..n-1的数组。 有没有办法选择每个线程将处理哪些单元格? 例如,线程0将处理单元格0和5,线程1将处理单元格1和6,依此类推。

如何使用OpenMP实现argmax?

我正在尝试使用OpenMP实现argmax。 如果简短,我有一个计算浮点值的函数: double toOptimize(int val); 我可以通过以下方式获得最大化值的整数: double best = 0; #pragma omp parallel for reduction(max: best) for(int i = 2 ; i best) best = v; } 现在,我如何获得对应于最大值的值? 编辑: 我正在尝试这个,但想确保它是有效的: double best_value = 0; int best_arg = 0; #pragma omp parallel { double local_best = 0; int ba = 0; #pragma omp for reduction(max: best_value) […]

运行时库本身就是动态库吗?

我正在为具有OpenMP并行化程序的系统进行交叉编译,但是当我在目标上运行时,我收到错误: 无法加载库’libgomp.so.1′ 环顾四周后,我发现它是一个OpenMP运行时库。 有没有在编译器主机上静态链接库,还是需要在目标机器上存在? 如果它可以静态链接,那么是什么使运行时库与动态库不同? 如果环境正确,可以静态或动态链接任何库吗?