Tag: openmp

omp_set_num_threads(1)的原因比没有openmp慢

我相信每个人都同意这篇文章的标题。 有人能指出我的理由吗? 任何像书等的引用? 我试图找到但没有运气。 我相信原因是openmp有一个同步开销,没有openmp项目没有。 希望有人可以扩大原因吗? 谢谢

Monte Carlo pi逼近的并行化

我正在编写ac脚本来与OpenMp并行化pi近似。 我认为我的代码在令人信服的输出下运行良好。 我现在用4个线程运行它。 我不确定的是,如果此代码容易受到竞争条件的影响? 如果是,如何协调此代码中的线程操作? 代码如下: #include #include #include #include #include double sample_interval(double a, double b) { double x = ((double) rand())/((double) RAND_MAX); return (ba)*x + a; } int main (int argc, char **argv) { int N = atoi( argv[1] ); // convert command-line input to N = number of points int i; int NumThreads […]

OpenMP中的本地指针

局部变量应该对每个线程自动私有。 如何将本地指针指向并行区域之外的某个地址,例如 A * a = new A[10]; int i, j; for (i = 0; i < 10; i++){ A * local_i = &a[i]; // do sth … #pragma omp parallel for for (j = 0; j x = 1.0f; // … } } delete[]a; 我应该将local_a私有和私人私人? 我实际上是OpenMP和C的新手。

GCC C / C ++ MEX Matlab R2015 Mac OS X(带有OpenMP)不起作用

我正在尝试使用GCC / G ++在Matlab中编译一个非常简单的MEX文件…首先我检查了它已经安装在matlab中:!gcc 输出:/ usr / bin / gcc …之后,我尝试执行以下操作: mex -v GCC =’/ usr / bin / gcc’hello.c 但它仍然使用XCode Clang进行编译……这是使用G ++和OPENMP库进行并行计算。 已知Mathworks不支持,但可能。

pi计算的OpenMP并行化要么是缓慢的,要么是错误的

我无法并行化我的monte carlo方法来计算pi。 这是并行化的for循环: #pragma omp parallel for private(i,x,y) schedule(static) reduction(+:count) for (i = 0; i < points; i++) { x = rand()/(RAND_MAX+1.0)*2 – 1.0; y = rand()/(RAND_MAX+1.0)*2 – 1.0; // Check if point lies in circle if(x*x + y*y < 1.0) { count++; } } 问题是,如果我使用schedule(static) ,它会低估pi,如果我使用schedule(static) ,它比串行实现慢。 我究竟做错了什么? 我已经尝试了其他方法来解决它(像这样: 使用OpenMP来计算PI的值 ),但它仍然比串行实现慢得多。 提前致谢

私有子句中的变量与OpenMP中并行区域中定义的变量之间是否存在任何差异?

我想知道是否有任何理由更喜欢OpenMP中的private(var)子句超过(私有)变量的本地定义,例如 int var; #pragma omp parallel private(var) { … } 与 #pragma omp parallel { int var; … } 另外,我想知道私人条款的重点是什么。 这个问题已在OpenMP中解释过:局部变量是否自动私有? ,但我确信答案是错的 我不喜欢答案,因为即使C89不阻止你在函数中间定义变量,只要它们在作用域的开头(这是自动的输入并行区域时的情况)。 因此,即使对于老式的C程序员来说,这也不应该有任何区别。 我是否应该将其视为语法糖,它允许在过去的好日子里使用“定义变量 – 在你的function中开始”的风格? 顺便说一下:在我看来,第二个版本也阻止程序员在并行区域之后使用私有变量,希望它可能包含一些有用的东西,所以另一个-1用于private子句。 但是因为我对OpenMP很陌生,所以如果没有对它进行很好的解释,我不想怀疑它。 提前谢谢你的答案!

是否有可能将此for循环并行化?

我得到了一些使用OpenMP进行并行化的代码,在各种函数调用中,我注意到这个for循环对计算时间有一些好的负罪感。 double U[n][n]; double L[n][n]; double Aprime[n][n]; for(i=0; i<n; i++) { for(j=0; j<n; j++) { if (j <= i) { double s; s=0; for(k=0; k= i) { double s; s=0; for(k=0; k<i; k++) { s += L[j][k] * U[k][i]; } L[j][i] = (Aprime[j][i] – s) / U[i][i]; } } 然而,在尝试并行化并在这里和那里应用一些信号量之后(没有运气),我开始意识到, else if条件对早期if具有强烈的依赖性​​( L[j][i]是一个已处理的数字)与U[i][i] ,可以设置在早期的if ),在我的观点中,由于竞争条件,使其不可并行化。 […]

跨职能部门的OpenMP线程团队的持久性

我有一个简单的程序,我用于物理模拟。 我想知道如何在OpenMP中实现某种线程范例。 int main() { #define steps (100000) for (int t = 0;t < steps; t++) { firstParallelLoop(); secondParallelLoop(); if (!(t%100)) { checkpoint(); } } } void firstParallelLoop() {// In another file.c #pragma omp parallel for for (int i = 0; i < sizeOfSim;i++) { //Some atomic floating point ops. } } 以前,我使用pthreads并在我的双核笔记本电脑上获得1.7加速。 使用OpenMP时,我似乎无法获得任何加速。 我怀疑问题是线程组/池正在快速创建和销毁,带来了灾难性的影响。 […]

使用OpenMP“无效控制谓词”编译器错误

我正在创建一个基本的素数检查器,基于C – 确定一个数字是否是素数 ,但是使用OpenMP。 int isPrime(int value) { omp_set_num_threads(4); #pragma omp parallel for for( int j = 2; j * j <= value; j++) { if ( value % j == 0) return 0; } return value; } 使用-fopenmp进行编译时,GCC版本4.7.2发生错误,声明了与for循环相关的invalid controlling predicate 。 看起来这个错误是由for循环中的j平方引起的。 有没有办法解决这个问题,仍然可以从算法中获得所需的输出?

OpenMP令人尴尬地并行循环,没有加速

我有一个非常简单的并行for循环,它只是将零写入整数数组。 但事实certificate线程越多,循环越慢。 我认为这是由于一些缓存抖动所以我玩了调度,块大小, __restrict__ ,在并行块内嵌套并行,并刷新。 然后我注意到读取数组进行缩减也比较慢。 这应该显然非常简单,并且应该几乎线性加速。 我在这里想念的是什么? 完整代码: #include #include #include #include void tic(), toc(); int main(int argc, const char *argv[]) { const int COUNT = 100; const size_t sz = 250000 * 200; std::vector vec(sz, 1); std::cout << "max threads: " << omp_get_max_threads()<< std::endl; std::cout << "serial reduction" << std::endl; tic(); for(int c […]