是否有任何相反的迹象表明这样做? 或者是指定的行为? #pragma omp parallel for for(auto x : stl_container) { … } 因为看来OpenMP规范只对c ++ 98有效,但是我猜可能会有更多的不兼容性,因为C ++ 11线程在这里没有使用。 我想确定,仍然。
OpenMP标准只考虑C ++ 98(ISO / IEC 14882:1998)。 这意味着在C ++ 03甚至C ++ 11下没有标准的OpenMP支持。 因此,任何使用C ++> 98和OpenMP的程序都会在标准之外运行,这意味着即使它在某些条件下工作,也不太可能是便携式的,但绝对不能保证。 C ++ 11拥有自己的multithreading支持,情况更糟糕,很可能在某些实现中会与OpenMP冲突。 那么,使用C ++ 03和C ++ 11的OpenMP有多安全? 在一个相同的程序中是否可以安全地使用C ++ 11multithreading和OpenMP,但是不会交织它们(即,在任何代码中没有OpenMP语句传递给C ++ 11并发特性,线程中没有C ++ 11并发由OpenMP产生)? 我特别感兴趣的是我首先使用OpenMP调用一些代码,然后在相同的数据结构上使用C ++ 11并发的其他代码。
描述 当使用openmp的parallel构造来分配和释放具有4个或更multithreading的随机大小的内存块时,程序似乎开始在testing程序的运行时间的后半部分泄漏大量的内存。 因此,它将消耗的内存从1050 MB增加到1500 MB或更多,而实际上并没有使用额外的内存。 由于valgrind没有显示任何问题,我必须假设内存泄漏实际上是内存碎片的强调效果。 有趣的是,如果2个线程每个分配10000个分配,效果不会显示,但是如果4个线程分别分配5000个分配,则效果会很强。 另外,如果分配的块的最大大小减less到256kb(从1mb),效果变弱。 重型并发可以强调分割吗? 或者这更可能是一个堆中的错误? testing程序说明 演示程序的构build是为了从堆中获取总共256 MB的随机大小的内存块,并进行5000次分配。 如果内存限制被触发,首先分配的块将被释放,直到内存消耗降到限制以下。 一旦执行了5000个分配,所有的内存都被释放,循环结束。 所有这些工作都是由openmp生成的每个线程完成的。 这种内存分配scheme允许我们预计每个线程(包括一些簿记数据)的内存消耗约为260 MB。 演示程序 由于这真的是你可能想要testing的东西,所以你可以用一个简单的makefile从下拉框下载示例程序。 按原样运行程序时,应该至less有1400 MB的RAM可用。 随意调整代码中的常量以满足您的需求。 为了完整,实际的代码如下: #include <stdlib.h> #include <stdio.h> #include <iostream> #include <vector> #include <deque> #include <omp.h> #include <math.h> typedef unsigned long long uint64_t; void runParallelAllocTest() { // constants const int NUM_ALLOCATIONS = 5000; // alloc's […]
OpenMP 4.0引入了一个名为“omp simd”的新构造。 使用这个构造比旧的“并行”有什么好处? 每个人什么时候比另一个更好呢? 编辑:这是一个有趣的文件相关的SIMD指令。
Valgrind线程错误检测工具Helgrind的文档,在这里find 警告说,如果你使用GCC编译你的OpenMP代码,GCC的OpenMP运行时库( libgomp.so )会导致数据争用的错误报告混乱,因为它使用primefaces机器指令和Linux futex系统调用而不是POSIX pthreads基元。 它告诉你可以通过使用–disable-linux-futexconfiguration选项重新编译GCC来解决这个问题。 所以我试了一下 我使用–disable-linux-futexconfiguration选项编译并安装到本地目录( 〜/ GCC_Valgrind / gcc_install )一个新的GCC版本4.7.0(本文最新版本)。 然后,我创build了一个小的OpenMPtesting程序( test1.c ),它没有可见的数据竞争: /* test1.c */ #include <omp.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 2 int a[NUM_THREADS]; int main(void) { int i; #pragma omp parallel num_threads(NUM_THREADS) { int tid = omp_get_thread_num(); a[tid] = tid + 1; } for (i = 0; […]
我有OpenMP共享内存机器(C和FORTRAN)的编码经验,以执行像matrix加法,乘法等简单的任务(只是看看它是如何与LAPACK竞争)。 我知道OpenMP足以执行简单的任务,而无需查看文档。 最近,我转移到Python为我的项目,我没有任何超过绝对的基本知识Python的经验。 我的问题是: 在Python中使用OpenMP 最简单的方法是什么? 最简单的,我的意思是在程序员方面花费最less的时间(即使它是以增加系统时间为代价的)。 我使用OpenMP的原因是因为串行代码可以转换为一个有效的并行代码,并且散布着几个!$OMP 。 实现粗略平行所需的时间非常less。 有没有什么办法在Python中复制这个function? 从浏览SO,我可以find: C扩展 StackLess Python 还有更多吗? 哪个最符合我的问题?
我使用Linux在C中创build一个multithreading应用程序。 我不确定是否应该使用POSIX线程API或OpenMP API。 什么是使用两者的优点和缺点? 编辑: 有人可以澄清这两个API是创build内核级还是用户级线程?
科学计算中的大多数人在共享内存并行化方面使用OpenMP作为准标准。 有没有任何理由(除了可读性)通过pthreads使用OpenMP? 后者似乎更基本,我怀疑它可以更快,更容易优化。
#pragma omp parallel { int x; // private to each thread ? } #pragma omp parallel for for (int i = 0; i < 1000; ++i) { int x; // private to each thread ? } 谢谢! PS如果局部variables是自动私有的,那么使用私有子句有什么意义?
我看了官方的定义,但是我还是很困惑。 firstprivate :指定每个线程应该有自己的variables实例,并且该variables应该用variables的值初始化,因为它存在于并行构造之前。 对我来说,这听起来很像私人。 我已经查找了一些例子,但我似乎并不了解它是如何特殊的,或者它如何被使用。 lastprivate :指定将封闭上下文的variables版本设置为执行最终迭代(for-loop结构)或最后一个部分(#pragma节)的任何线程的专用版本。 我觉得我理解这个更好一点,因为下面的例子: #pragma omp parallel { #pragma omp for lastprivate(i) for (i=0; i<n-1; i++) a[i] = b[i] + b[i+1]; } a[i]=b[i]; 所以,在这个例子中,我明白lastprivate允许i作为最后一个值被返回到循环之外。 我刚开始学习OpenMP。